10

Ich benutze die DownloadManager um Bilder von unserem Server herunterzuladen und ich lege die Dateien in die externalFilesDir.java.lang.SecurityException: Permission Denial: nicht erlaubt Sendung Broadcast android.intent.action.MEDIA_MOUNTED on KitKat nur

Ich sende eine Broadcastabsicht, weil ich nicht möchte, dass diese heruntergeladenen Bilder in der Galerie erscheinen.

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + context.getExternalFilesDir(null)))); 

Getestet habe ich nur auf meinem Galaxy S3 Jelly Bean 4.3 vor und es funktioniert, aber wenn ich es auf KitKat 4.4 getestet stürzt die App.

Gibt es eine bessere Möglichkeit, die vom DownloadManager heruntergeladenen Dateien nicht in der Telefongalerie anzuzeigen?

Stack Trace

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

Ihre Frage ist nicht eindeutig: wollen Sie ** ** und die Dateien aus in der Galerie erscheinen, oder tun willst du sicherstellen, dass sie dort erscheinen? Um zu verhindern, dass Dateien in einem bestimmten Verzeichnis in der Galerie (oder anderen Medienbibliotheken) angezeigt werden, legen Sie eine Datei mit dem Namen '.nomedia' im selben Verzeichnis ab. Führen Sie einen Medienscan aus, wie in den Antworten unten beschrieben, damit Dateien sofort angezeigt werden. – user149408

Antwort

30

Es scheint, dass Google dies versucht, von KITKAT zu verhindern.
Mit Blick auf core/rest/AndroidManifest.xml werden Sie feststellen, dass Broadcast jetzt geschützt ist. Was bedeutet, dass es eine Übertragung ist, die nur das System senden kann.

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

Die folgende Beschreibung ist für alle Versionen arbeiten:

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); 
} 

Wenn die oben arbeitet die folgenden nicht versuchen:

Nach dieser post Sie eine andere Art und Weise brauchen etwas reparieren.
Wie mit MediaScannerConnection oder ACTION_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's funktioniert perfekt .. –

+0

Also, wird dies für alle Versionen von Android funktionieren? –

+0

@SiddharthVyas Gemäß der Dokumentation soll MediaScannerConnection API von API Level 1 funktionieren, also sollten alle Versionen von android funktionieren. http://developer.android.com/reference/android/media/MediaScannerConnection.html –

26

weiß, dass ich seine spät, aber versuchen, diese kann in allen Versionen arbeiten:

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

wie Datei in erhalten geschützter void onActivityResult (int requestCode, int resultCode, Intent Daten) { super.onActivityResult (requestCode, resultCode, Daten); –

+0

Danke, das half mit meiner Frage: http://stackoverflow.com/questions/37996241/android-asus-nexus-7-does-not-commit-emulated-memory-until-restart – eplewis89

+0

Super .. funktioniert wie ein Charme ... + 1 Stimme –

Verwandte Themen