简体   繁体   English

java.lang.SecurityException:权限拒绝:不允许仅在 KitKat 上发送广播 android.intent.action.MEDIA_MOUNTED

[英]java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.MEDIA_MOUNTED on KitKat only

I am using the DownloadManager to download images off our server and I am placing the files in the externalFilesDir .我正在使用DownloadManager从我们的服务器下载图像,并将文件放在externalFilesDir

I am send out a broadcast intent because I don't want these downloaded images to appear in the gallery.我发送了一个广播意图,因为我不希望这些下载的图像出现在图库中。

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

I only tested this on my Galaxy S3 Jelly Bean 4.3 prior and it was working, but when I tested it on KitKat 4.4 it crashes the app.我之前只在我的 Galaxy S3 Jelly Bean 4.3 上测试过它并且它可以工作,但是当我在KitKat 4.4上测试它时它使应用程序崩溃。

Is there a better way to not have the files downloaded from the DownloadManager not appear in the phone gallery?有没有更好的方法让从 DownloadManager 下载的文件不出现在手机图库中?

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 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

It seems that google is trying to prevent this from KITKAT.似乎谷歌正试图阻止 KITKAT 发生这种情况。
Looking at core/rest/AndroidManifest.xml you will notice that broadcast android.intent.action.MEDIA_MOUNTED is protected now.查看core/rest/AndroidManifest.xml您会注意到广播android.intent.action.MEDIA_MOUNTED现在受到保护。 Which means it is a broadcast that only the system can send.这意味着它是一个只有系统可以发送的广播。

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

The following should work for all versions:以下应该适用于所有版本:

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

If the above is not working try the following:如果上述方法不起作用,请尝试以下操作:

According to this post you need another way to fix it.根据这篇文章,您需要另一种方法来修复它。
Like using MediaScannerConnection or ACTION_MEDIA_SCANNER_SCAN_FILE .就像使用MediaScannerConnectionACTION_MEDIA_SCANNER_SCAN_FILE

MediaScannerConnection.scanFile(this, new String[] {

file.getAbsolutePath()},

null, new MediaScannerConnection.OnScanCompletedListener() {

public void onScanCompleted(String path, Uri uri)

{


}

});

I know it's late but try this, it works in every version:我知道已经晚了,但试试这个,它适用于每个版本:

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

As a variant作为变种

public static void refreshDir(@NonNull Context context, @NonNull File dir) {

    notifyFileDeleted(context, dir);

    File[] files = dir.listFiles();

    if (files != null) {
        for (File file : files) {
            if (file.isDirectory())
                refreshDir(context, file);
            else
                notifyFileCreated(context, file);
        }
    }
}

public static void notifyFileCreated(@NonNull Context context, @NonNull File file) {
        //disable notification for non-existent files, folders and files from a location inaccessible via mtp
        if (file.exists() && file.isFile() && file.getAbsolutePath().indexOf("/data/data/") != 0) {
            MediaScannerConnection.scanFile(context, new String[]{file.getAbsolutePath()}, null, null);
            context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
        }
    }

public static void notifyFileDeleted(@NonNull Context context, @NonNull File file) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
            context.getApplicationContext().sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.fromFile(file)));
        }
        else{
            Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
            Uri uri = Uri.fromFile(file);
            intent.setData(uri);
            context.sendBroadcast(intent);
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 CSipSimple-java.lang.SecurityException:权限拒绝:不允许发送广播android.intent.action.Phone_State - CSipSimple - java.lang.SecurityException : Permission Denial: not allowed to send broadcast android.intent.action.Phone_State java.lang.SecurityException:权限拒绝:不允许在android 7(N OS)上发送广播android.intent.action.NEW_OUTGOING_CALL - java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.NEW_OUTGOING_CALL on android 7 (N OS) java.lang.SecurityException:权限拒绝,仅适用于kitkat版本的android.intent.action.PHONE_STATE - java.lang.SecurityException: Permission Denial, android.intent.action.PHONE_STATE only on kitkat version java.lang.SecurityException:权限拒绝:不允许发送广播android.hardware.usb.action.USB_STATE - java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.hardware.usb.action.USB_STATE android:致命异常:java.lang.SecurityException:权限拒绝:启动意图{act = android.media.action.IMAGE_CAPTURE - android: FATAL EXCEPTION: java.lang.SecurityException: Permission Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE Android:java.lang.SecurityException:权限拒绝:启动意图 - Android: java.lang.SecurityException: Permission Denial: start Intent Android - java.lang.SecurityException:权限拒绝:启动 Intent - Android - java.lang.SecurityException: Permission Denial: starting Intent Android:java.lang.SecurityException:权限拒绝:开始发送邮件的意图 - Android: java.lang.SecurityException: Permission Denial: start Intent to send mail java.lang.SecurityException:权限被拒绝:启动 Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] - java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] SecurityException:权限被拒绝:不允许发送广播android.intent.action.BATTERY_CHANGED - SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.BATTERY_CHANGED
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM