«

»

Mar 15

שמירה וטעינה ממערכת הקבצים

שמירה וטעינה ממערכת הקבצים

אייקון-שמירה-וטעינה-ממערכת-הקבצים

רקע תאורטי:

 

במכשיר האנדרואיד יש 2 סוגים של זכרון קבצים:

יש את ה internal – שהוא כרטיס זכרון שנמצא במכשיר עצמו שאי אפשר להוציא אותו.

ויש את ה external – שהוא ה SD-Card. שאותו אפשר להוציא.

בנוסף ישנם מכשירים, כמו ה Galaxy S2 וה Galaxy S3 שבהם יש שני internal memory. שאחד מהם נחשב כ external memory בנוסף ל SD-Card.

 

הבדלים בין ה External Storage ל Internal Storage:

1. ה External Storage – SD-Card פתוח למשתמש והמשתמש יכול לגשת לקבצים שאתה שומר שם ולמחוק/לשנות אותם כרצונו. אלא אם כן יש לו הרשאות root.

ה Internal Storage – internal memory לא נגיש למשתמש.

2.. הקבצים שאתה שומר ב external storage נגישים לכל אפליקציה שרוצה להשתמש בהם בעוד שהקבצים שאתה שומר ב internal storage מוגנים משימוש באפליקציות אחרות (אלא אם כן אתה מגדיר אותם כנגישים לאפליקציות אחרות)

3. בדרך כלל ב external יש יותר מקום והוא פחות מהיר. אבל זה לא נכון באופן גורף וזה משתנה ממכשיר למכשיר. באופן אישי, לא שמתי לב לשינוי משמעותי.

 

בשביל לקבל את ה root folder של ה external:

נקרא ל getExternalStorageDirectory. בדוגמה במכשיר שלי ה getExternalStorageDirectory יחזיר (יכול להשתנות בין מכשיר למכשיר):

/mnt/sdcard

נהוג לשמור את הקבצים בתת תיקייה:

<getExternalStorageDirectory>/Android/data/<The app package name>/files/…

או בתיקייה:

getExternalStorageDirectory>/Android/data/<The app package name>/cache/…

זאת מכיוון שמערכת ההפעלה מוחקת את התיקייה הזאת כאשר עושים uninstall לאפליקצייה. (יש לציין שמניסויים במכשיר שלי, ב Samsung Galaxy S2, הקבצים הללו נשארו בניגוד למה שמתואר ב APIs של גוגל)

 

בשביל לקבל את ה root folder של ה internal:

נקרא ל getFilesDir שזה בכל המכשירים:

/data/data/<The app package name>/files

אנחנו מקבלים מיקום לתיקייה שמערכת ההפעלה מנהלת ושם מומלץ לשמור את התמונות של האפליקצייה. מערכת ההפעלה יכולה למחוק את הקבצים שנשמרים שם במקרה והיא לחוצה בזכרון internal.

כאשר נעשה uninstall לאפליקצייה הקבצים ששמרנו בזכרון ה internal ימחקו.

 

לקבצים שנשמרים ב internal storage יש כמה סוגי הרשאות:

MODE_PRIVATE

שאומר שרק האפליקציה שלך תוכל לגשת לקובץ ששמרת ב internal storage.

MODE_WORLD_READABLE

שגם לאפליקציות אחרות יש גישה לקרוא לקובץ ששמרת ב internal storage.

MODEֹ_WORL_WRITEABLE

שגם לאפליקציות אחרות יש גישה לכתיבה לקובץ ששמרת ב internal storage.

בברירת המחדל, כל קובץ שאתה שומר ל internal storage נשמר ב MODE_PRIVATE. אם אתה רוצה לשתף אותו לאפליקציות אחרות צריך לציין במפורש ע”י MODE_WORLD_READABLE/WRITEABLE

דוגמה והסבר:

 

הרשאות להוסיף ל manifest:

בשביל קריאה וכתיבה ל internal storage אין צורך בהרשאות. מכיוון שכאשר אנו קוראים ל: getFilesDir אנחנו מקבלים path לאיזור במערכת הקבצים שמוקצה לאפליקציה שלנו.

בשביל כתיבה ל external storage נצטרך להוסיף את ההרשאה:


בשביל קריאה מה external storage כרגע לא צריך להכריז על הרשאות אך גוגל אמרה שהיא מתכננת להוסיף שנצטרך להכריז על הרשאה לקריאה שנצטרך להכריז:


 

תהליך השמירה:

כעקרון תהליך השמירה מורכב מ:

1. לקבל את תיקיית הבסיס שאליה נשמור את הקובץ – ב internal או ב external.

ב external ע”י: getExternalStorageDirectory

ב internal ע”י: getFilesDir

2. להוסיף תת תיקייה נוספת, כמו images/video/audio/files.

3. ליצור את הקובץ שבו נשמור את התמונה/וידאו/קובץ המוזיקה/מחרוזת.

4. השמירה: ליצור FileOutputStream לקובץ ולהעתיק את ה bytes של התמונה/וידאו/קובץ המוזיקה/מחרוזת ל FileOutputStream.

 

שמירת תמונה:

1. ו 2. לקבל את תיקיית הבסיס שאליה נשמור את הקובץ ולהוסיף תת תיקייה נוספת:

במקרה שנרצה לשמור ל external:

private static final String	EXTERNAL_STORAGE_IMAGE_PATH	= "Android/data/co.il.lior.test.fileSystemManager/Images";

קבלת ה root של ה external storage ובה התיקייה לשמירת התמונות:

imagesFolderPath = Environment.getExternalStorageDirectory()+"/"+EXTERNAL_STORAGE_IMAGE_PATH;
final File filePath = new File(imagesFolderPath);

יצירת תת התיקייה לשמירת התמונות אם היא לא הייתה כבר קיימת:

filePath.mkdirs();

 

במקרה שנרצה לשמור ל internal:

private static final String	INTERNAL_STORAGE_IMAGE_PATH	= "/Images";

קבלת ה root של ה internal storage ובה התיקייה לשמירת התמונות:

File filesDirPath = _context.getFilesDir();
filesDirPath.mkdirs();
imagesFolderPath = filesDirPath.getAbsolutePath() + INTERNAL_STORAGE_IMAGE_PATH;
File filePathToImagesFolderPath = new File(imagesFolderPath);

יצירת תת התיקייה לשמירת התמונות אם היא לא הייתה כבר קיימת:

filePathToImagesFolderPath.mkdirs();

 

3. יצירת הקובץ שבו נשמור את ה bitmap:

final String fileNameToSaveImage = bitmapName+"."+SAVE_FORMAT_FOR_IMAGE;
final File file = new File(imagesFolderPath, fileNameToSaveImage);

 

4. שמירת התמונה לקובץ:

OutputStream fOut = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
fOut.flush();
fOut.close();
fOut = null;

 

טעינת תמונה:

final Bitmap bitmapFromFS = BitmapFactory.decodeFile(completePathToImage);
return bitmapFromFS;

 

שמירת וידאו:

קובץ הוידאו מתקבל כ Uri מהאפליקציה של אדרואיד של ה MediaStore. אנו נשמור את הקובץ ע”י זה שפשוט נעתיק אותו מהמקום שהוא נשמר בו, למיקום אחר.

זה יותר ישיר משמירת תמונה מכיוון שלא צריך להמיר את הקובץ ל bitmap.

אפשר להסתכל באופן ישיר בקוד לראות איך עושים זאת. גם פה יש הפרדה בשביל לקבל את ה path לשמירה ל external וה internal.

בשביל ללמוד איך להקליט וידאו ולקבל את ה uri של ההקלטה, אפשר לקרוא את המאמר על הקלטת וידאו ושמירתו.

 

שמירת קובץ שמע:

קובץ המוזיקה מתקבל כקובץ מתוכנת ההקלטה, שמירת קובץ מוזיקה זה פשוט העתקה של קובץ למקום אחר. בשביל ללמוד איך להקליט שמע אפשר לקרוא את המאמר על הקלטת שמע, הפעלתו ובחירתו.

 

שמירת מחרוזת לקובץ:

את הדוגמה המלאה אפשר לראות בפרוייקט לדוגמה, אבל העקרון הוא שפשוט שומרים את ה bytes של ה String ל FileOutputStream.

FileOutputStream fos = new FileOutputStream(fileToSaveTextTo);
fos.write(text.getBytes());

לינק להורדת הפרויקט לדוגמה

 

עכשיו יש לכם מחלקה שמנהלת לכם בקלות את כל ההתעסקות עם הקבצים

בהצלחה !

Leave a Reply

Your email address will not be published.

אתם יכולים להשתמש באפשרויות ותגי ה-HTMLהבאים: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>