权限拒绝:需要 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);
// 如果片段则替换 this 为 getActivity()
它会自动获得权限
【讨论】:
以上是关于权限拒绝:需要 android.permission.READ_EXTERNAL_STORAGE 或 grantUriPermission() (API 23)的主要内容,如果未能解决你的问题,请参考以下文章