برای ارائه ایمن یک فایل از برنامه خود به برنامه دیگر، باید برنامه خود را به گونه ای پیکربندی کنید که یک دسته امن به فایل در قالب یک 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
برای اطلاعات بیشتر مرتبط به این موضوع مراجعه کنید: