权限拒绝:需要 android.permission.READ_EXTERNAL_STORAGE 或 grantUriPermission() (API 23)

Posted

技术标签:

【中文标题】权限拒绝:需要 android.permission.READ_EXTERNAL_STORAGE 或 grantUriPermission() (API 23)【英文标题】:Permission Denial: requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission() (API 23) 【发布时间】:2016-10-10 11:43:08 【问题描述】:

我正在尝试在运行时请求用户权限。 API 是 23,我想从手机的图库中获取图像。在一些 sn-ps 之后,这是我到目前为止的代码:

在我检查的Activity的onCreate()中:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) !=
            PackageManager.PERMISSION_GRANTED) 
        imageUploader5.setEnabled(true);
        ActivityCompat.requestPermissions(this, new String[]
                 Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE , 0);
    

然后我覆盖:

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) 
    if (requestCode == 0) 
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED
                && grantResults[1] == PackageManager.PERMISSION_GRANTED) 
            imageUploader5.setEnabled(true);
        
    

但我仍然无法让应用在 AVD 上运行。

编辑:清单中的权限:

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

【问题讨论】:

在您的清单文件上添加权限..... 我有,更新了我上面的问题。 【参考方案1】:

根据您构建if 语句的方式,您将仅在已授予用户权限的情况下请求用户权限。添加else 块,如下所示:

// Enable if permission granted
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) ==
        PackageManager.PERMISSION_GRANTED) 
    imageUploader5.setEnabled(true);
 
// Else ask for permission
else 
    ActivityCompat.requestPermissions(this, new String[]
             Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE , 0);

编辑

在清单中概括您的 user-permission(不带 -sdk-23 后缀),以便它可以被不同的和未来的 API 级别使用:

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

【讨论】:

非常感谢!完美运行!【参考方案2】:
defaultConfig 
    applicationId "com.myapp"
    minSdkVersion 11
    targetSdkVersion 22
    versionCode 1
    versionName "1.0"

只会这样做。注意 targetSdkVersion 22

【讨论】:

【参考方案3】:

您检查权限如下

public static int REQUEST_STORAGE_PERMISSION = 122;

 if (checkStoragePermission()) 
      imageUploader5.setEnabled(true);
   else 
       requestStoragePermission();
  



 private boolean checkStoragePermission() 
    return ActivityCompat.checkSelfPermission(RegisterActivity.this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;


private void requestStoragePermission() 
    ActivityCompat.requestPermissions(RegisterActivity.this,
            new String[]Manifest.permission.WRITE_EXTERNAL_STORAGE,
            REQUEST_STORAGE_PERMISSION);


@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_STORAGE_PERMISSION) 
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) 
            imageUploader5.setEnabled(true);
         else 
            imageUploader5.setEnabled(false);

        
    

【讨论】:

【参考方案4】:

下面的权限类链接:-

https://jeeteshsurana.blogspot.com/2017/07/permission-class-pass-activity.html

创建Sperate类并调用

PermissionClass.checkAndRequestPermissions(this);

// 如果片段则替换 thisgetActivity()

它会自动获得权限

【讨论】:

以上是关于权限拒绝:需要 android.permission.READ_EXTERNAL_STORAGE 或 grantUriPermission() (API 23)的主要内容,如果未能解决你的问题,请参考以下文章

谷歌播放权限问题

Android权限标签uses-permission

Android APP使用系统签名

如何使用android API从android中获取wifi网络的名称?

android 三种定位方式

使用相机的许可[重复]