برای ارائه ایمن یک فایل از برنامه خود به برنامه دیگر، باید برنامه خود را به گونه ای پیکربندی کنید که یک دسته امن به فایل در قالب یک URI محتوا ارائه دهد. مؤلفه Android FileProvider
بر اساس مشخصاتی که در XML ارائه میکنید، URI محتوا را برای فایلها تولید میکند. این درس به شما نشان میدهد که چگونه پیادهسازی پیشفرض FileProvider
را به برنامه خود اضافه کنید و چگونه فایلهایی را که میخواهید به برنامههای دیگر ارائه دهید را مشخص کنید.
توجه: کلاس FileProvider
بخشی از کتابخانه هسته AndroidX است. برای اطلاعات در مورد گنجاندن این کتابخانه در برنامه خود، به اعلام وابستگی ها مراجعه کنید.
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
برای اطلاعات بیشتر مرتبط به این موضوع مراجعه کنید: