当前位置: 首页 > 知识库问答 >
问题:

SecurityException:权限拒绝:读取(仅在模拟器上)

张智
2023-03-14

我在我的应用程序中有两个活动,Mainactive调用ImagePicker,它有一个GridView,可以列出手机库中的所有图像,我使用ContentResolver来获取光标。

当我测试它时,它在我的手机上运行良好,但每次在模拟器上都会立即崩溃。

以下是错误日志:

java.lang.SecurityException:权限拒绝:读取com.android.providers.media。媒体提供者uricontent://media/external/images/media从pid=5934开始,uid=10060需要android.permission。READ_EXTERNAL_STORAGE或grantUriPermission()

我确实有书面形式的许可,如下所示:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity android:name=".ImagePicker" />
</application>

共有3个答案

白修谨
2023-03-14

如果您的应用程序目标版本为23,则会出现此错误,如果您的要求包括API级别23,则您需要将目标设置为23,并需要动态检查权限https://developer.android.com/training/permissions/requesting.html

注意:即使您提供目标22或更低,您的应用程序也可以使用23,而不会出现此(检查权限)错误。

莫选
2023-03-14

在调用方法之前,请检查权限。

private void checkPermission(){
    int permissionCheck = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE);

    if (permissionCheck != PackageManager.PERMISSION_GRANTED) {     
         ActivityCompat.requestPermissions(         
    getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, Constants.WRITE_EXTERNAL_STORAGE); 
    } else {    
         callMethod(); 
    }
}

检查权限结果。

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {

            case Constants.WRITE_EXTERNAL_STORAGE:
                if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
                    callMethod(); 
                }
                break;

            default:
                break;
        }
    }
萧献
2023-03-14

你的模拟器是什么版本的android?你是用SDK 23编译的吗?如果您的模拟器是Marshmallow,则需要在运行时显式检查权限。这是由于新的权限模型。

有关详细信息,请查看有关权限的文档:https://developer.android.com/training/permissions/index.html

 类似资料:
  • 我在HTC DESIRE 626GPlus双SIM卡和Android 4.4.2上得到了这个错误

  • 我的应用程序中有一个活动,允许用户逐个从设备中选择多个文件,我正在使用这样的意图: 这工作得很好,我正在获取所选文件的Uri,它们看起来像这样: 然后,如果文件是图像,我将使用以下方式对其进行解码: 当用户单击按钮时,我通过 intent 将 Uris 列表传递给另一个活动,在此活动中,在 AsyncTask 中,我正在以 base64 编码文件以通过网络发送: 问题是,当我打开inputStre

  • 从今天起,我们的Airflow服务无法访问BigQuery中的查询。所有作业都会失败,并显示以下消息: [2021-03-12 10:17:28079]{taskinstance.py:1150}错误-原因:403获取https://bigquery.googleapis.com/bigquery/v2/projects/waipu-app-prod/queries/e62030d7-36eb-4

  • 问题内容: 当我尝试运行简单的docker命令时,例如: 我收到一条错误消息: 获得权限被拒绝… /var/run/docker.sock:connect:权限被拒绝 当我检查权限 我看到这一行: 因此,我遵循许多论坛的建议并将本地用户添加到docker组: 但这无济于事。我仍然收到非常相同的错误消息。我该如何解决? 问题答案: 对于那些刚接触shell的人,命令: 需要在您的外壳中定义。默认情况

  • 问题内容: 尝试显示URI时出现以下异常。我认为这是在我的活动停止后发生的,我尝试再次访问可行的URI。还有其他问题可以解决这个问题,但是我对如何对我的代码应用任何解决方案感到非常困惑,因为我的takePhotoIntent允许拍照或从图库中选择图片(如下所示)。 我的createImageFile和我的takePhotoIntent: 问题答案: 根据Storage Access Framewo