权限拒绝:需要 android.permission.READ_EXTERNAL_STORAGE,或 grantUriPermission() (API 23)
Permission Denial: requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission() (API 23)
我正尝试在 运行 时请求用户权限。 API 是 23,我想从 phone 的画廊中挑选一张图片。遵循一些片段,这是我到目前为止的代码:
在 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" />
defaultConfig {
applicationId "com.myapp"
minSdkVersion 11
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
会去做的。注意
targetSdkVersion 22
根据您构建 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" />
您检查权限如下
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);
}
}
}
权限Class link如下:-
https://jeeteshsurana.blogspot.com/2017/07/permission-class-pass-activity.html
创建 Sperate class 并调用
PermissionClass.checkAndRequestPermissions(这个);
// 如果片段则将 this 替换为 getActivity()
它会自动获得权限
我正尝试在 运行 时请求用户权限。 API 是 23,我想从 phone 的画廊中挑选一张图片。遵循一些片段,这是我到目前为止的代码:
在 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" />
defaultConfig {
applicationId "com.myapp"
minSdkVersion 11
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
会去做的。注意 targetSdkVersion 22
根据您构建 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" />
您检查权限如下
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);
}
}
}
权限Class link如下:-
https://jeeteshsurana.blogspot.com/2017/07/permission-class-pass-activity.html
创建 Sperate class 并调用
PermissionClass.checkAndRequestPermissions(这个);
// 如果片段则将 this 替换为 getActivity()
它会自动获得权限