10

Używam DownloadManager do pobierania obrazów z naszego serwera i umieszczam pliki w externalFilesDir.java.lang.SecurityException: Odmowa uprawnień: niedozwolone wysyłanie audycji android.intent.action.MEDIA_MOUNTED na KitKat only

Wysyłam zamiar transmisji, ponieważ nie chcę, aby te pobrane obrazy pojawiały się w galerii.

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

I tylko przetestowane na moim Galaxy S3 Jelly Bean 4.3 przed i to działa, ale gdy testowałem go na KitKat 4.4 zawiesi aplikację.

Czy istnieje lepszy sposób, aby pliki pobrane z modułu DownloadManager nie były wyświetlane w galerii telefonu?

Śledzenie stosu

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

Twoje pytanie jest niejednoznaczna: chcesz ** ** pliki zapobiec pojawianiu się w galerii, czy chcesz ** upewnić się, że ** pojawiają się tam? Aby zapobiec wyświetlaniu plików w określonym katalogu w Galerii (lub innych bibliotekach multimedialnych), umieść plik o nazwie .nomedia w tym samym katalogu. Aby natychmiast wyświetlić pliki, uruchom skanowanie multimediów zgodnie z opisem w poniższych odpowiedziach. – user149408

Odpowiedz

30

Wydaje się, że Google stara się temu zapobiec KitKat.
Patrząc na core/rest/AndroidManifest.xml zauważysz, że transmisja android.intent.action.MEDIA_MOUNTED jest teraz chroniona. Co oznacza, że ​​jest to transmisja, którą może wysłać tylko system.

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

Poniższy powinien działać na wszystkich wersjach:

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

Jeśli powyższe nie działa spróbuj wykonać następujące czynności:

Według tego post trzeba w inny sposób naprawić to.
Podobnie jak przy użyciu MediaScannerConnection lub 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 działa idealnie .. –

+0

Czy to działa dla wszystkich wersji Androida? –

+0

@SiddharthVyas Zgodnie z dokumentacją interfejs MediaScannerConnection API powinien działać z poziomu interfejsu API 1, więc wszystkie wersje Androida powinny działać. http://developer.android.com/reference/android/media/MediaScannerConnection.html –

26

Znam jego późno ale spróbuj może to działa we wszystkich wersjach:

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

jak uzyskać plik w chronione void onActivityResult (int requestCode, int resultCode, dane intencji) { super.onActivityResult (requestCode, kod wynikowy, dane); –

+0

Dzięki, pomogło mi to w moim pytaniu: http://stackoverflow.com/questions/37996241/android-asus-nexus-7-does-not-commit-emulated-memory-until-restart – eplewis89

+0

Super..works like a Charm ... + 1 głos –

Powiązane problemy