
PictureSaver מהשיעורים הקודמים ומתאימים אותה למערך בתים.save, מקבלת Bitmap, כותבת אותו עם FileOutputStream לתיקיית התמונות החיצונית עם שם שנגזר מתאריך ושעה, ומרעננת את הגלריה כדי שהתמונה תופיע מיד, בלי הפעלה מחדש של המכשיר.byte[] pictureBytes, ממירה אותו עם BitmapFactory.decodeByteArray (מהבית הראשון, באורך המערך) וקוראת ל-save עם ה-Bitmap.CameraSurfaceView הפונקציה savePicture קוראת ל-PictureSaver.save עם pictureBytes. מעטפת try/catch מדווחת שגיאה דרך listener.onError אם ה-Listener אינו null.Matrix, קוראים ל-postRotate(90) ובונים Bitmap חדש עם Bitmap.createBitmap (מהנקודה 0,0, רוחב וגובה המקור והמטריצה), ושומרים אותו.הטקסט המלא של הדקות הראשונות בהרצאה «מצלמה - חלק 6 - שמירת קובץ תמונה» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
הדבר האחרון שנשאר לנו לעשות בדוגמה של ה-surface view שמציגה את הקאמרה זה לשמור את התמונה. עכשיו, באחד הסרטונים הקודמים הייתה לנו מחלקה שביצעה שמירה ויש לנו בדיוק את המחלקה הזאת כאן בדוגמה הזאת, היא נקראת Picture Saver.
בואו רגע ניכנס למחלקה הזאת ונזכר מה הפעולות שעשינו. אז בנינו איזושהי פונקציה שנקראת Compress Bitmap, שמה שהיא עשתה היא קיבלה אובייקט Bitmap as is, כמו שהוא צולם ויש לנו פה פייל output stream בכדי לכתוב אותו לסטרים כאן קיבלנו איזשהו נתיב לתמונה
כאשר הנתיב בנוי גם מנתיב לתיקיית התמונות החיצונית מה שנקרא external storage וגם שם של קובץ שבנוי מהתאריך הנוכחי והשעה הנוכחית ומה שאנחנו רואים זה שיש לנו כאן איזושהי מכרוזת שבנינו fine name, pick underline עם התאריך והשעה הנוכחיים, ויש לנו כאן החזרה של הנתיב וה-fine name.
זאת אומרת, הפונקציה get full path and fine name פשוט מחזירה לנו שם ייחודי עבור התמונה, פתחנו פה file output stream, שמרנו את התמונה כ-compressed image, ועשינו איזשהו רפרש לדיסק בכדי לראות אותה מיידית.
אם לא היינו עושים את הרפרש הזה, זה לא שהתמונה לא הייתה נשמרת, היא הייתה נשמרת, פשוט היו רואים אותה רק כשהיו עושים ריסטארט למכשיר.
והפקודה הזאת חסכה לנו ריסטארט. אבל מה הבעיה כרגע? אין לנו אובייקט ביטמאפ. יש לנו אובייקט שהוא בעצם מערך בתים מקורי. אז קודם כל בואו נהפוך את השם הזה למילה פשוט סייב.
שיהיה קצת יותר ברור, כי אנחנו פשוט עושים סייבינג פשוט, ונשכפל את הפונקציה הזאת לעוד פונקציה, שהתפקיד של הפונקציה השנייה זה לקבל מערך בתים, בייט, פיקצ'ר בייטס, בדיוק מה שיש לנו, ולשמור את התמונה במערך בתים. זאת אומרת שיש לנו עכשיו שתי פונקציות, אחת שמקבלת ביטמאפ, שזה בסדר כמו מקודם, ואחת שמקבלת מערך בתים,
זה פשוט ההעמסה של הפונקציה הקודמת. אנחנו רוצים לגשת ל-pictureSaver.save הזאת ולתת את המערך בתים. מה אנחנו עושים עם המערך בתים? אנחנו צריכים להמיר אותו ל-bitmap.
אז בואו נפתח פה ביטמאפ ולצורך המראה יש לנו ביטמאפ-factory.decodebyte array הנה ה-picturebytes אנחנו רוצים להתחיל מ- אנחנו רואים offset, זה אומר 0 אנחנו רוצים להתחיל מהבית הראשון ואנחנו רוצים להמיר את כל הבתים זה אומר pictureBytes.length והנה יש לנו עכשיו המרה של הבתים של התמונה לאובייקט ביטמאפ אם יש לנו המרה של אובייקט ביטמאפ אנחנו יכולים
לקרוא לפונקציית save ולשלוח את הביטמאפ כעת אנחנו צריכים לקרוא לפונקציית ה-save הזאת מתוך הקוד שמבצע את השמירה זה היה בקאמרה surface view כאן הייתה לנו פונקציית save picture למה יש את הפונקציה הזאת בתוך אובייקט ה-camera surface view שבנינו ולא מבחוץ?
בגלל שיש לנו כאן את אובייקט התמונה, את הבתים שלה, אז זה כאילו איזשהו שירות שאנחנו מספקים בתור רכיב חיצוני שאנחנו בונים. אוקיי, אז בואו ניגש ל-save picture ונקרא ל-picture saver.save ואנחנו רואים שיש פה שתי העמסות שבנינו וכל מה שאנחנו צריכים
להעביר זה את הפיקצ'ר בייטס ולטפל באקספצ'ן. אז בואו נבצע סראונד וויד וכאשר ישנה שגיאה כל מה שאנחנו צריכים לעשות זה לקרוא לליסנר נקודה און אירו ולשלוח את אובייקט החריגה שיתרחש בדיוק כמו שעשינו פה מקודם.
בואו רק באמת נעשה את הבדיקה הזאת אם הליסנר שונה מנהל. נשמור פה על אחידות אם הליסנר שונה מנהל, זה אומר שרוצים לקבל דיווחי שגיאות ואז אנחנו רק מדווחים את השקיעה שקרתה, ואין לנו פה יותר אקספשן.
בואו בשלב הזה נבדוק את זה, הנה תוכנית רצה, הנה אנחנו רואים את תיבת הציוד המשרדי, בואו נלחץ על צילום, אם אנחנו מבצעים cancel לא קורה כלום, בואו נלחץ שוב פעם, אם אנחנו מבצעים שמירה חזרנו בחזרה אבל אנחנו רוצים לראות אם באמת המערכת שמרה את התמונה.
אז בואו ניגש כעת לגלרי והנה יש לנו כאן את התמונה שנשמרה. בואו ניכנס לאלבום הקאמרה ונראה באלבום הקאמרה שתי תמונות שצילמנו בעבר בסרטונים הקודמים ואנחנו אין לנו מה להתעסק איתם כרגע.
בואו פשוט נבצע סלקט אנחנו לא רוצים שהוא יבלבל