Permission Denial: not allowed to send broadcast android.intent.action.MEDIA_MOUNTED解决方法

在android4.4及以上版本的手机里运行,碰到如下异常:

[plain] view plain copy
  1. <pre name="code" class="html">12-21 12:02:07.643: E/AndroidRuntime(28893): java.lang.RuntimeException: An error occured while executing doInBackground()  
  2. 12-21 12:02:07.643: E/AndroidRuntime(28893):    at android.os.AsyncTask$3.done(AsyncTask.java:300)  
  3. 12-21 12:02:07.643: E/AndroidRuntime(28893):    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)  
  4. 12-21 12:02:07.643: E/AndroidRuntime(28893):    at java.util.concurrent.FutureTask.setException(FutureTask.java:222)  
  5. 12-21 12:02:07.643: E/AndroidRuntime(28893):    at java.util.concurrent.FutureTask.run(FutureTask.java:242)  
  6. 12-21 12:02:07.643: E/AndroidRuntime(28893):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)  
  7. 12-21 12:02:07.643: E/AndroidRuntime(28893):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)  
  8. 12-21 12:02:07.643: E/AndroidRuntime(28893):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)  
  9. 12-21 12:02:07.643: E/AndroidRuntime(28893):    at java.lang.Thread.run(Thread.java:818)  
  10. 12-21 12:02:07.643: E/AndroidRuntime(28893): <strong>Caused by: java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.MEDIA_MOUNTED from pid=28893, uid=10249</strong>  
  11. 12-21 12:02:07.643: E/AndroidRuntime(28893):    at android.os.Parcel.readException(Parcel.java:1540)  
  12. 12-21 12:02:07.643: E/AndroidRuntime(28893):    at android.os.Parcel.readException(Parcel.java:1493)  
  13. 12-21 12:02:07.643: E/AndroidRuntime(28893):    at android.app.ActivityManagerProxy.broadcastIntent(ActivityManagerNative.java:2795)  
  14. 12-21 12:02:07.643: E/AndroidRuntime(28893):    at android.app.ContextImpl.sendBroadcast(ContextImpl.java:1327)  
  15. 12-21 12:02:07.643: E/AndroidRuntime(28893):    at android.content.ContextWrapper.sendBroadcast(ContextWrapper.java:376)  
  16. 12-21 12:02:07.643: E/AndroidRuntime(28893):    at net.micode.fileexplorer.FileViewInteractionHub.notifyFileSystemChanged(FileViewInteractionHub.java:585)  
  17. 12-21 12:02:07.643: E/AndroidRuntime(28893):    at net.micode.fileexplorer.FileViewInteractionHub.onFileChanged(FileViewInteractionHub.java:1088)  
  18. 12-21 12:02:07.643: E/AndroidRuntime(28893):    at net.micode.fileexplorer.FileOperationHelper$4.run(FileOperationHelper.java:218)  
  19. 12-21 12:02:07.643: E/AndroidRuntime(28893):    at net.micode.fileexplorer.FileOperationHelper$3.doInBackground(FileOperationHelper.java:164)  
  20. 12-21 12:02:07.643: E/AndroidRuntime(28893):    at android.os.AsyncTask$2.call(AsyncTask.java:288)  
  21. 12-21 12:02:07.643: E/AndroidRuntime(28893):    at java.util.concurrent.FutureTask.run(FutureTask.java:237)  
  22. 12-21 12:02:07.643: E/AndroidRuntime(28893):    ... 4 more  


问题所在:Android4.4及以上版本中限制了只有系统应用才有权限发送广播(Android.intent.action.MEDIA_MOUNTED)通知系统扫描SD卡,非系统应用则无权限,一旦运行则出现上述异常。

解决方法:将net.micode.fileexplorer.FileViewInteractionHub.Java文件中的notifyFileSystemChanged()修改如下:

[java] view plain copy
  1. private void notifyFileSystemChanged(String path) {  
  2.     if (path == null)  
  3.         return;  
  4.     final File f = new File(path);  
  5.     if (Build.VERSION.SDK_INT >= 19 /*Build.VERSION_CODES.KITKAT*/) { //添加此判断,判断SDK版本是不是4.4或者高于4.4  
  6.         String[] paths = new String[]{Environment.getExternalStorageDirectory().toString()};  
  7.         String[] paths = new String[]{path};  
  8.         MediaScannerConnection.scanFile(mContext, paths, nullnull);  
  9.     } else {  
  10.      final Intent intent;  
  11.      if (f.isDirectory()) {  
  12.          intent = new Intent(Intent.ACTION_MEDIA_MOUNTED);  
  13.          intent.setClassName("com.android.providers.media""com.android.providers.media.MediaScannerReceiver");  
  14.          intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));  
  15.          Log.v(LOG_TAG, "directory changed, send broadcast:" + intent.toString());  
  16.      } else {  
  17.          intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);  
  18.          intent.setData(Uri.fromFile(new File(path)));  
  19.          Log.v(LOG_TAG, "file changed, send broadcast:" + intent.toString());  
  20.      }  
  21.      mContext.sendBroadcast(intent);  
  22.     }  

你可能感兴趣的:(源码,文件管理器)