web-dev-qa-db-ja.com

java.lang.SecurityException:許可の拒否:ブロードキャストAndroid.intent.action.MEDIA_MOUNTEDをKitKatのみで送信することは許可されていません

DownloadManagerを使用してサーバーからイメージをダウンロードし、externalFilesDirにファイルを配置しています。

これらのダウンロードした画像をギャラリーに表示したくないので、ブロードキャストインテントを送信しています。

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

Galaxy S3 Jelly bean 4.3でのみこれをテストし、動作していましたが、KitKat 4.4アプリをクラッシュさせます。

DownloadManagerからダウンロードしたファイルが電話ギャラリーに表示されないようにするより良い方法はありますか?

スタックトレース

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 com.walintukai.lfdate.SocketIOService$1@42359f40
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
15
The Nomad

グーグルはキットカットからこれを防止しようとしているようです。
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 修正する別の方法が必要です。
MediaScannerConnectionまたはACTION_MEDIA_SCANNER_SCAN_FILE

MediaScannerConnection.scanFile(this, new String[] {

file.getAbsolutePath()},

null, new MediaScannerConnection.OnScanCompletedListener() {

public void onScanCompleted(String path, Uri uri)

{


}

});
42
Lazy Ninja

私はそれが遅いことを知っていますが、これがすべてのバージョンで動作することを試してください:

   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())));
                }
28
WonderSoftwares