הגדרת שיתוף קבצים

כדי להציע קובץ מהאפליקציה בצורה מאובטחת לאפליקציה אחרת, צריך להגדיר את האפליקציה כך שתציע כינוי מאובטח לקובץ, בצורת URI של תוכן. הרכיב FileProvider של Android יוצר מזהי URI של תוכן לקבצים, בהתאם למפרט שסיפקתם ב-XML. בשיעור הזה נסביר איך להוסיף את הטמעת ברירת המחדל של FileProvider לאפליקציה, ואיך לציין את הקבצים שרוצים להציע לאפליקציות אחרות.

הערה: הכיתה FileProvider היא חלק מAndroidX Core Library. למידע נוסף על הכללת הספרייה הזו באפליקציה, ראו הצהרת יחסי תלות.

ציון ה-FileProvider

כדי להגדיר FileProvider לאפליקציה, צריך להוסיף רשומה למניפסט. הרשומה הזו מציינת את הרשות שבה משתמשים ליצירת מזהי URI של תוכן, וגם את השם של קובץ XML שמציין את הספריות שהאפליקציה יכולה לשתף.

קטע הקוד הבא מסביר איך להוסיף למניפסט את הרכיב <provider> שמציין את המחלקה FileProvider, את הרשות ואת השם של קובץ ה-XML:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <application
        ...>
        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="com.example.myapp.fileprovider"
            android:grantUriPermissions="true"
            android:exported="false">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepaths" />
        </provider>
        ...
    </application>
</manifest>

בדוגמה זו, המאפיין android:authorities מציין את רשות ה-URI שבה רוצים להשתמש עבור מזהי URI של תוכן שנוצרו על ידי FileProvider. בדוגמה הזו, הרשות היא com.example.myapp.fileprovider. באפליקציה שלכם, צריך לציין רשות שמכילה את הערך של android:package באפליקציה, עם המחרוזת 'fileprovider' שמצורפת אליו. למידע נוסף על הערך של הרשות, ראו את הנושא URI של תוכן ואת המסמך בנושא המאפיין android:authorities.

אלמנט הצאצא <meta-data> של <provider> מפנה לקובץ XML שמציין את הספריות שרוצים לשתף. המאפיין android:resource הוא הנתיב והשם של הקובץ, ללא הסיומת .xml.התוכן של הקובץ הזה מתואר בקטע הבא.

ציון ספריות שניתנות לשיתוף

אחרי שמוסיפים את FileProvider לקובץ המניפסט של האפליקציה, צריך לציין את הספריות שמכילות את הקבצים שרוצים לשתף. כדי לציין את הספריות, מתחילים על ידי יצירת הקובץ filepaths.xml בספריית המשנה res/xml/ של הפרויקט. בקובץ הזה, מציינים את הספריות על ידי הוספת רכיב XML לכל ספרייה. קטע הקוד הבא מציג דוגמה לתוכן של res/xml/filepaths.xml. קטע הקוד גם מדגים איך לשתף ספריית משנה של הספרייה files/ באזור האחסון הפנימי:

<paths>
    <files-path path="images/" name="myimages" />
</paths>

בדוגמה הזו, התג <files-path> משתף ספריות בתוך הספרייה files/ שבאחסון הפנימי של האפליקציה. המאפיין path משתף את ספריית המשנה images/ של files/. המאפיין name מציין ל-FileProvider להוסיף את מקטע הנתיב myimages למזהי URI של תוכן עבור קבצים בספריית המשנה files/images/.

לרכיב <paths> יכולים להיות כמה צאצאים, וכל אחד מהם מציין ספרייה אחרת לשיתוף. בנוסף לרכיב <files-path>, ניתן להשתמש ברכיב <external-path> כדי לשתף ספריות באחסון חיצוני, וברכיב <cache-path> כדי לשתף ספריות בספריית המטמון הפנימית שלכם. למידע נוסף על רכיבי הצאצא שמציינים ספריות משותפות, עיינו במשאבי העזרה של FileProvider.

הערה: קובץ ה-XML הוא הדרך היחידה לציין את הספריות שרוצים לשתף. אי אפשר להוסיף ספרייה באופן פרוגרמטי.

עכשיו יש לכם מפרט מלא של FileProvider שיוצר URI של תוכן לקבצים בתיקייה files/ של האחסון הפנימי של האפליקציה, או לקבצים בספריות המשנה של files/. כשהאפליקציה יוצרת URI של תוכן לקובץ, היא מכילה את הרשות שצוינה ברכיב <provider> (com.example.myapp.fileprovider), בנתיב myimages/ ובשם הקובץ.

לדוגמה, אם מגדירים FileProvider לפי קטעי הקוד בשיעור הזה ומבקשים URI של תוכן בשביל הקובץ default_image.jpg, הפונקציה FileProvider מחזירה את ה-URI הבא:

content://com.example.myapp.fileprovider/myimages/default_image.jpg

מידע נוסף בנושא זמין במאמרים הבאים: