10

我正在使用DownloadManager從我們的服務器上下載圖像,而我將這些文件放在externalFilesDirjava.lang.SecurityException:權限拒絕:不允許在KitKat上發送廣播android.intent.action.MEDIA_MOUNTED

我發送廣播意圖,因爲我不希望這些下載的圖像出現在畫廊中。

​​

我只測試了這個在我的Galaxy S3果凍豆4.3之前,它是工作,但是當我測試了KitKat 4.4它崩潰的應用程序。

有沒有更好的方法,不從下載的文件下載的文件不出現在手機畫廊?

堆棧跟蹤

06-05 17:34:41.940: E/AndroidRuntime(15410): FATAL EXCEPTION: main 
06-05 17:34:41.940: E/AndroidRuntime(15410): Process: com.walintukai.lfdate, PID: 15410 
06-05 17:34:41.940: E/AndroidRuntime(15410): java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.DOWNLOAD_COMPLETE flg=0x10 pkg=com.walintukai.lfdate (has extras) } in [email protected] 
06-05 17:34:41.940: E/AndroidRuntime(15410): at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:778) 
06-05 17:34:41.940: E/AndroidRuntime(15410): at android.os.Handler.handleCallback(Handler.java:733) 
06-05 17:34:41.940: E/AndroidRuntime(15410): at android.os.Handler.dispatchMessage(Handler.java:95) 
06-05 17:34:41.940: E/AndroidRuntime(15410): at android.os.Looper.loop(Looper.java:136) 
06-05 17:34:41.940: E/AndroidRuntime(15410): at android.app.ActivityThread.main(ActivityThread.java:5057) 
06-05 17:34:41.940: E/AndroidRuntime(15410): at java.lang.reflect.Method.invokeNative(Native Method) 
06-05 17:34:41.940: E/AndroidRuntime(15410): at java.lang.reflect.Method.invoke(Method.java:515) 
06-05 17:34:41.940: E/AndroidRuntime(15410): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
06-05 17:34:41.940: E/AndroidRuntime(15410): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605) 
06-05 17:34:41.940: E/AndroidRuntime(15410): at dalvik.system.NativeStart.main(Native Method) 
06-05 17:34:41.940: E/AndroidRuntime(15410): Caused by: java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.MEDIA_MOUNTED from pid=15410, uid=10135 
06-05 17:34:41.940: E/AndroidRuntime(15410): at android.os.Parcel.readException(Parcel.java:1465) 
06-05 17:34:41.940: E/AndroidRuntime(15410): at android.os.Parcel.readException(Parcel.java:1419) 
06-05 17:34:41.940: E/AndroidRuntime(15410): at android.app.ActivityManagerProxy.broadcastIntent(ActivityManagerNative.java:2390) 
06-05 17:34:41.940: E/AndroidRuntime(15410): at android.app.ContextImpl.sendBroadcast(ContextImpl.java:1127) 
06-05 17:34:41.940: E/AndroidRuntime(15410): at android.content.ContextWrapper.sendBroadcast(ContextWrapper.java:365) 
06-05 17:34:41.940: E/AndroidRuntime(15410): at com.walintukai.lfdate.SocketIOService$1.onReceive(SocketIOService.java:111) 
06-05 17:34:41.940: E/AndroidRuntime(15410): at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:768) 
06-05 17:34:41.940: E/AndroidRuntime(15410): ... 9 more 
+0

你的問題是不明確的:你想** **防止出現在畫廊中的文件,或做你想**確保他們出現在那裏?要防止某個目錄中的文件出現在Gallery(或其他媒體庫)中,請將名爲'.nomedia'的文件放在同一個目錄中。要立即顯示文件,請按照以下答案中的說明運行介質掃描。 – user149408

回答

30

看來,谷歌正在努力防止這種奇巧。
看着core/rest/AndroidManifest.xml你會注意到廣播android.intent.action.MEDIA_MOUNTED現在受到保護。這意味着它是隻有系統才能發送的廣播。

<protected-broadcast android:name="android.intent.action.MEDIA_MOUNTED" /> 

下應適用於所有版本的工作:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
    final Intent scanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
    final Uri contentUri = Uri.fromFile(outputFile); 
    scanIntent.setData(contentUri); 
    sendBroadcast(scanIntent); 
} else { 
    final Intent intent = new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())); 
    sendBroadcast(intent); 
} 

如果以上不工作請嘗試以下操作:

根據這一post你需要另一種方式要解決這個問題。
像使用MediaScannerConnectionACTION_MEDIA_SCANNER_SCAN_FILE

MediaScannerConnection.scanFile(this, new String[] { 

file.getAbsolutePath()}, 

null, new MediaScannerConnection.OnScanCompletedListener() { 

public void onScanCompleted(String path, Uri uri) 

{ 


} 

}); 
+0

Thanks.it的工作完美.. –

+0

那麼,這將工作的所有版本的Android? –

+0

@SiddharthVyas根據文檔MediaScannerConnection API應該從API級別1工作,所以Android的所有版本應該工作。 http://developer.android.com/reference/android/media/MediaScannerConnection.html –

26

我知道它的晚,但這種嘗試可以在所有版本的工作:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
        Intent mediaScanIntent = new Intent(
          Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
        Uri contentUri = Uri.fromFile(out); \\out is your output file 
        mediaScanIntent.setData(contentUri); 
        this.sendBroadcast(mediaScanIntent); 
       } else { 
        sendBroadcast(new Intent(
          Intent.ACTION_MEDIA_MOUNTED, 
          Uri.parse("file://" 
            + Environment.getExternalStorageDirectory()))); 
       } 
+0

如何獲取文件 保護無效onActivityResult(int requestCode,int resultCode,意圖數據){ super.onActivityResult(requestCode,resultCode,data ); –

+0

謝謝,這有助於我的問題:http://stackoverflow.com/questions/37996241/android-asus-nexus-7-does-not-commit-emulated-memory-until-restart – eplewis89

+0

超級..像一個魅力... + 1票 –

相關問題