权限拒绝:在安卓中不允许发送广播。

12

我创建了一个简单的相机应用程序。在除了Android 4.4之外的所有Android版本中都可以正常工作。当我从我的相机应用中拍照时,会出现以下错误。

java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.MEDIA_MOUNTED from pid=26089, uid=10120

出现错误:

出错位置:

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));

如何在KITKAT上解决这个问题?

请告诉我!

谢谢!


可能值得你花时间阅读其他类似的帖子。 http://stackoverflow.com/questions/17759041/permission-denialbroadcasting-intent-is-not-exported - brad J
4个回答

20

如何在KITKAT中解决此问题?

那段代码从未合适过。幸运的是,安卓现在(终于)正在采取措施防止应用程序欺骗更多类似这样的系统广播。

如果你想让安卓索引放在外部存储上的文件,使用MediaScannerConnectionACTION_MEDIA_SCANNER_SCAN_FILE即可。


我尝试使用MediaScannerConnection,就像这样http://pastebin.com/Fve98x6s,在Kitkat设备上可以工作,但在Android 4.3及以下设备上无法工作。 - AndroidDev
@AndroidDev:在旧版的Android设备上,我使用MediaScannerConnection没有遇到任何问题。 - CommonsWare
@AndroidDev 你在 Android 4.3 及以下设备上测试通过了吗? - anujprashar

10
我解决了这个问题,你可以使用以下代码:sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, mediaMountUri)); 希望这可以帮助你!

仅使用媒体根路径对我无效。您需要传递实际更改的文件的URI,只有该文件将被扫描。 - user149408

5

Android防止应用发送像ACTION_MEDIA_SCANNER_SCAN_FILE和ACTION_MEDIA_MOUNTED这样的广播。请改用MediaScannerConnection的静态方法scanFile。

MediaScannerConnection.scanFile(getApplicationContext(), new String[] { file.getAbsolutePath() }, null, new OnScanCompletedListener() {

                @Override
                public void onScanCompleted(String path, Uri uri) {
                    // TODO Auto-generated method stub

                }
            });

这对我来说很有效,可以在画廊中显示图像。谢谢Yvan。 - louis1204
ACTION_MEDIA_MOUNTED在KitKat中被锁定了。 ACTION_MEDIA_SCANNER_SCAN_FILE仍然允许,并且与您的代码基本相同,但限制为仅扫描单个文件。与意图的主要区别:没有回调,并且即使进程在其之前结束,扫描也将完成(不像使用MediaScannerConnection)。 - user149408

2

简短回答:你不能,至少不容易。

许多应用程序以前都使用这个意图来在只更改一个文件后重新扫描整个文件系统,这会大大消耗电池寿命。从Android 4.4开始,只有系统应用程序才能使用它。你可能需要找到一个不使用此意图的解决方法。


你能给我一个解决方法吗?我想不出有什么解决方法。 - TheDevMan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接