【问题标题】:MediaScannerConnection fails on Android 6 because of permission denial由于权限被拒绝,MediaScannerConnection 在 Android 6 上失败
【发布时间】: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 但似乎不起作用。
  • 我也有同样的问题

标签: android-permissions android-6.0-marshmallow


【解决方案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。
  • 答案仍然与列出的问题相关,并且对遇到类似问题的其他人有用。我赞成删除反对票。一旦覆盖了应用程序中的所有事件,有没有办法设置权限?而不必弄清楚应用可能需要在哪里请求权限?
猜你喜欢
  • 2013-07-31
  • 1970-01-01
  • 1970-01-01
  • 2020-01-04
  • 2016-06-14
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
  • 1970-01-01
相关资源
最近更新 更多