البرمجة

حل مشكلة FileUriExposedException في Android N

لحل مشكلة فتح الملفات المحمّلة على نظام Android N، يجب التعامل مع تغييرات مقدمة الـ FileProvider. إذا كان تطبيقك يستخدم الـ DownloadManager لتنزيل الملفات ومن ثم فتحها، فيجب عليك تعديل الكود ليتوافق مع تغييرات الـ FileProvider.

أولاً، دعني أوضح لك الخطأ الذي تواجهه والذي يظهر عند محاولة تحويل مسار الملف إلى Content URI. الخطأ الذي تتلقاه يشير إلى أنه تعذر العثور على جذر مكون تم تكوينه ليحتوي على المسار الذي تم البحث عنه. يحدث هذا لأن FileProvider يحتاج إلى مسارات محددة للتحقق من صلاحية الوصول للملفات.

قم بمراجعة ملف file_paths.xml الذي تم إنشاؤه لـ FileProvider. في هذا الملف، يجب تعريف المسارات التي تحتاج إلى الوصول إليها. في حالتك، يبدو أنك تحتاج إلى الوصول إلى مجلد التنزيل، لذا يجب عليك تحديد ذلك في file_paths.xml.

القي نظرة على محتوى ملف file_paths.xml:

xml
"1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="external_files" path="." /> paths>

في هذا الملف، يُعرف مسار الـ باسم “external_files” ويشير إلى “.” الذي يمثل المجلد الجذر للتخزين الخارجي (External Storage)، وهذا الأمر قد لا يتوافق مع موقع تنزيلاتك.

بما أن التنزيلات تُحفظ عادةً في مجلد “Download”، فيجب عليك تحديد هذا المسار بدقة في ملف file_paths.xml. يمكنك تحديد المسار الصحيح باستخدام العنصر مع تحديد مسار الدليل الذي يحتوي على ملفات التنزيل.

على سبيل المثال، إذا كانت الملفات تُحفظ في مجلد “Download”، فيمكنك تحديد ذلك كالتالي:

xml
"1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="download" path="Download/" /> paths>

بعد ذلك، يجب تعديل الكود لاستخدام الـ FileProvider بشكل صحيح. هناك بعض التغييرات التي يجب إجراؤها في الكود لضمان استخدام FileProvider بشكل صحيح.

في كلمات أخرى، عليك استخدام FileProvider لتحويل مسار الملف إلى Content URI، ثم تمرير هذا الـ URI إلى النية (Intent) التي تستخدمها لفتح الملف. يجب أن يتم منح الإذن للنية للوصول إلى الملف باستخدام الـ URI الذي يتم توفيره من قبل FileProvider.

هذه الخطوات يجب أن تساعدك في تجاوز مشكلة الـ FileUriExposedException وفتح الملفات بنجاح على Android N. استمر في محاولة الحل ولا تتردد في طرح المزيد من الأسئلة إذا واجهتك صعوبات أخرى.

المزيد من المعلومات

بالطبع، إليك المتابعة:

بعد أن قمت بتحديد مسار المجلد الصحيح في ملف file_paths.xml، يجب الآن تعديل الكود لاستخدام FileProvider بدلاً من تحويل مسار الملف مباشرةً إلى Content URI. هذا يتطلب استخدام FileProvider للحصول على Content URI صالح للملف الذي تريد فتحه.

لتحقيق ذلك، يمكنك تغيير الكود كما يلي:

java
// استبدل هذا الكود: File file = new File(localUri); Uri contentUri = FileProvider.getUriForFile(ctxt, "my.file.provider", file); // بالكود التالي: Uri contentUri = Uri.parse(localUri);

في هذا التغيير، نستبدل استخدام FileProvider.getUriForFile() ببساطة باستخدام Uri.parse() لتحويل المسار إلى URI. هذا يعمل بشكل صحيح لأن FileProvider سيقوم بالتعامل مع توفير Content URI للملف.

بعد ذلك، يجب أن تقوم بتعديل النية (Intent) لاستخدام Content URI بدلاً من المسار المحلي مباشرةً. هنا هو كيفية تعديل هذا الجزء من الكود:

java
Intent openFileIntent = new Intent(Intent.ACTION_VIEW); openFileIntent.setDataAndType(contentUri, mimeType); openFileIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_NO_HISTORY); try { ctxt.startActivity(openFileIntent); } catch (ActivityNotFoundException e) { // تجاهل في حالة عدم العثور على تطبيق مناسب. }

هذا التعديل يستخدم setDataAndType() لتعيين Content URI ونوع MIME للملف. ثم يتم تعيين الإذن للقراءة إلى النية باستخدام Intent.FLAG_GRANT_READ_URI_PERMISSION، وهذا يضمن أن التطبيق الذي يفتح الملف لديه الإذن لقراءة المحتوى من الـ URI المقدم. ثم يتم تعيين Intent.FLAG_ACTIVITY_NO_HISTORY لتجنب إضافة النشاط إلى سجل العمليات.

مع هذه التغييرات، يجب أن يعمل تطبيقك الآن بشكل صحيح على Android N دون إثارة مشكلة FileUriExposedException. يُرجى تجربة هذه الحلول وإعلامي بالنتائج. إذا كان لديك أي أسئلة إضافية أو تحتاج إلى مزيد من المساعدة، فلا تتردد في طرحها.

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر