اذهب إلى المحتوى
  • 0

مشكلة في إذن الوصول إلى التخزين الخارجي في تطبيق Flutter على نظام Android

امل_هاني

السؤال

انا اقوم ببناء برنامج ب flutter البرنامج عباره عن مشغل موسيقى عندما اعمل run البرنامج يتنصب على هاتفي  ولكنه يغلق مباشره وتظهر لي رساله ( هل تريد من البرنامج السماح بالوصول ) عندما اقوم بالضغط على سماح اذهب للبحث عن البرنامج في جهازي وافتح التطبيق , التطبيق يعمل بشكل جيد لكن لماذا في بدايه تشغيله البرنامج يغلق كان هناك خطأ في البرنامج

هذا هو الكود الذي استخدمه للسماح بالوصول 

@override
    void onInit() {
      // TODO: implement onInit
      super.onInit();
      checkPermission();
    }

checkPermission() async{
      
      var perm = await Permission.storage.request();
      if(perm.isGranted){
       
      }else{
        checkPermission();
      }
    }

 تأكد من كل الحزم اللازمه في التطبيق 

 

  permission_handler: ^11.0.1

وتاكد من ملف AndroidManifest.xml 

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

 هذا ما يظهر لي اثناء اغلاق البرنامج في vcode terminal 

 

Installing build\app\outputs\flutter-apk\app-debug.apk...          34.7s
W/xample.musicap(25714): Accessing hidden method Landroid/content/ContextWrapper;->getDisplay()Landroid/view/Display; (light greylist, linking)
W/OnAudioQueryPlugin(25714): The application doesn't have access to the library
E/AndroidRuntime(25714): FATAL EXCEPTION: main
E/AndroidRuntime(25714): Process: com.example.musicapp, PID: 25714
E/AndroidRuntime(25714): java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/audio/media from pid=25714, uid=10324 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
E/AndroidRuntime(25714):        at android.os.Parcel.createException(Parcel.java:1966)
E/AndroidRuntime(25714):        at android.os.Parcel.readException(Parcel.java:1934)
E/AndroidRuntime(25714):        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)
E/AndroidRuntime(25714):        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
E/AndroidRuntime(25714):        at android.content.ContentProviderProxy.query(ContentProviderNative.java:418)
E/AndroidRuntime(25714):        at android.content.ContentResolver.query(ContentResolver.java:809)
E/AndroidRuntime(25714):        at android.content.ContentResolver.query(ContentResolver.java:759)
E/AndroidRuntime(25714):        at android.content.ContentResolver.query(ContentResolver.java:717)
E/AndroidRuntime(25714):        at com.lucasjosino.on_audio_query.queries.AudioQuery$loadSongs$2.invokeSuspend(AudioQuery.kt:75)
E/AndroidRuntime(25714):        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
E/AndroidRuntime(25714):        at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
E/AndroidRuntime(25714):        at kotlinx.coroutines.internal.LimitedDispatcher.run(LimitedDispatcher.kt:42)
E/AndroidRuntime(25714):        at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:95)
E/AndroidRuntime(25714):        at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:570)
E/AndroidRuntime(25714):        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
E/AndroidRuntime(25714):        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:677)
E/AndroidRuntime(25714):        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:664)
E/AndroidRuntime(25714):        Suppressed: kotlinx.coroutines.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@3043ab4, Dispatchers.Main.immediate]
I/Process (25714): Sending signal. PID: 25714 SIG: 9
Lost connection to device.
Syncing files to device SM N9500... 

كيف استطيع حل هذا المشكله وماسبب المشكله ؟

تم التعديل في بواسطة Mustafa Suleiman
تعديل عنوان السؤال
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

سبب المشكلة هو أنك لم تمنح التطبيق الإذن للوصول إلى التخزين الخارجي، ويتطلب تطبيقك إذن القراءة من التخزين الخارجي لتحميل الموسيقى من جهازك.

حاول تعديل الكود لطلب الإذن من المستخدم عند بدء تشغيل التطبيق كالتالي:

import 'package:permission_handler/permission_handler.dart';

void main() {
  // ...

  // Request permission to access external storage
  Permission.storage.request().then((permissionStatus) {
    if (permissionStatus == PermissionStatus.granted) {
      // Permission granted
    } else {
      // Permission denied
    }
  });

  // ...
}

وسيتم عرض رسالة منبثقة للمستخدم يطلب منه منح الإذن، فإن وافق المستخدم، فسيتمكن التطبيق من الوصول إلى التخزين الخارجي.

أو بدلاً من ذلك تستطيع إضافة إذن القراءة من التخزين الخارجي إلى ملف AndroidManifest.xml، حيث سيؤدي ذلك إلى منح التطبيق الإذن تلقائيًا عند تثبيته.

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

أعتقد أن التطبيق لا يمتلك إذن الوصول إلى التخزين الخارجي.

وهذا هو سبب ظهور رسالة "هل تريد من البرنامج السماح بالوصول" عند تشغيل التطبيق لأول مرة.

لإصلاح هذه المشكلة، تحتاج إلى طلب إذن التخزين الخارجي من المستخدم عند تشغيل التطبيق لأول مرة. يمكنك القيام بذلك باستخدام الكود التالي:

import 'package:permission_handler/permission_handler.dart';

@override
void onInit() {
  // TODO: implement onInit
  super.onInit();
  checkPermission();
}

checkPermission() async {
  var perm = await Permission.storage.request();
  if (perm.isGranted) {
    // The user has granted the permission
  } else {
    // The user has denied the permission
  }
}

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ On 1‏/11‏/2023 at 12:41 قال Mustafa Suleiman:

سبب المشكلة هو أنك لم تمنح التطبيق الإذن للوصول إلى التخزين الخارجي، ويتطلب تطبيقك إذن القراءة من التخزين الخارجي لتحميل الموسيقى من جهازك.

حاول تعديل الكود لطلب الإذن من المستخدم عند بدء تشغيل التطبيق كالتالي:

import 'package:permission_handler/permission_handler.dart';

void main() {
  // ...

  // Request permission to access external storage
  Permission.storage.request().then((permissionStatus) {
    if (permissionStatus == PermissionStatus.granted) {
      // Permission granted
    } else {
      // Permission denied
    }
  });

  // ...
}

وسيتم عرض رسالة منبثقة للمستخدم يطلب منه منح الإذن، فإن وافق المستخدم، فسيتمكن التطبيق من الوصول إلى التخزين الخارجي.

أو بدلاً من ذلك تستطيع إضافة إذن القراءة من التخزين الخارجي إلى ملف AndroidManifest.xml، حيث سيؤدي ذلك إلى منح التطبيق الإذن تلقائيًا عند تثبيته.

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

 

لقد قمت بأضافه هذا الكود البرمجي ولكن المشكله مازالت موجود اقوم بعمل run يقوم بتنزيل التطبيق ثم يغلق مباشره وتظهر لي رساله السماح بالوصول  اضغط السماح ثم اذهب للبحث عنه واقوم بفتحه يعمل بشكل جيد

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...