由于权限被拒绝,MediaScannerConnection 在 Android 6 上失败

Posted

技术标签:

【中文标题】由于权限被拒绝,MediaScannerConnection 在 Android 6 上失败【英文标题】:MediaScannerConnection fails on Android 6 because of permission denial 【发布时间】:2016-01-12 19:26:56 【问题描述】:

我使用 MediaScannerConnection 来调用它的 scanFile 方法,用于将图像添加到设备库。但在 android 6 中,当我执行它时会收到此异常:

E/DatabaseUtils: java.lang.SecurityException: Permission Denial: 阅读 com.android.providers.media.MediaProvider uri content://media/external/fs_id from pid=22984, uid=10078 需要 android.permission.READ_EXTERNAL_STORAGE,或grantUriPermission()

E/iu.UploadsManager:java.lang.SecurityException:权限拒绝: 阅读 com.android.providers.media.MediaProvider uri content://media/external/fs_id from pid=22984, uid=10078 需要 android.permission.READ_EXTERNAL_STORAGE,或grantUriPermission()

有什么帮助吗?

【问题讨论】:

我面临同样的问题。我正在尝试将视频上传到 Youtube,但我遇到了同样的错误。你找到解决办法了吗? 不。我注意到当我使用 WhatsApp 拍照时,在聊天中,我可以在 LogCat 中看到同样的错误。因此,由于新的运行时权限,这可能是 Android 6 的问题...... 我尝试添加标志 Intent.FLAG_GRANT_READ_URI_PERMISSION 但似乎不起作用。 我也有同样的问题 【参考方案1】:

这是处理权限的新方法的结果。您的应用现在需要请求运行时许可并准备好被拒绝。

在您的 onCreate(或任何地方)中检查并可能请求许可:

            if (ContextCompat.checkSelfPermission(this,
            Manifest.permission.READ_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED) 

        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.READ_EXTERNAL_STORAGE)) 

            // Show an expanation to the user *asynchronously* -- don't block
            // this thread waiting for the user's response! After the user
            // sees the explanation, try again to request the permission.

         else 

            // No explanation needed, we can request the permission.

            ActivityCompat.requestPermissions(this,
                    new String[]Manifest.permission.READ_EXTERNAL_STORAGE,
                    MY_PERMISSIONS_REQUEST_READ_MEDIA);

            // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
            // app-defined int constant. The callback method gets the
            // result of the request.
        
    

然后准备好接受这样的权限:

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) 
    switch (requestCode) 
        case MY_PERMISSIONS_REQUEST_READ_MEDIA: 
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) 
             else 
                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            
            return;
        
    

【讨论】:

没有。如您所见,异常不是由我的应用程序引发的,而是由 DatabaseUtils 和 UploadsManager 引发的。并且运行时权限(还)不会影响我的应用程序,因为我的目标不是 API 23。 答案仍然与列出的问题相关,并且对遇到类似问题的其他人有用。我赞成删除反对票。一旦覆盖了应用程序中的所有事件,有没有办法设置权限?而不必弄清楚应用可能需要在哪里请求权限?

以上是关于由于权限被拒绝,MediaScannerConnection 在 Android 6 上失败的主要内容,如果未能解决你的问题,请参考以下文章

由于违反权限政策,我的 SMS 传输相关应用被拒绝

由于权限被拒绝,MediaScannerConnection 在 Android 6 上失败

由于权限处理程序,应用程序被 Google Play 商店拒绝

由于权限被拒绝,无法绑定到某些端口

为啥 Python pyusb usb.core 访问由于权限而被拒绝,为啥 rules.d 不能修复它?

错误:由于环境错误而无法安装软件包:[Errno 13] 权限被拒绝:我如何解决? [关闭]