应用程序不要求获得权限
Application Not Asking to get Permissions
我有此代码可获得以下权限(READ_PHONE_STATE, READ_CONTACTS, WRITE_CONTACTS):
int permissionCheck = ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_PHONE_STATE);
int permissionCheck1 = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS);
int permissionCheck2 = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_CONTACTS);
if (permissionCheck != PackageManager.PERMISSION_GRANTED && permissionCheck1 != PackageManager.PERMISSION_GRANTED && permissionCheck2 != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.READ_PHONE_STATE}, 1);
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, 2);
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_CONTACTS}, 3);
} else {
TelephonyManager tMgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
mPhoneNumber = tMgr.getLine1Number();
}
我知道我没有这些权限,因为我收到如下错误消息:
java.lang.SecurityException: Permission Denial: opening provider com.android.providers.contacts.ContactsProvider2 from ProcessRecord{95e4cb4 30797:com.example.ortel.tagnet/u0a217} (pid=30797, uid=10217) requires android.permission.READ_CONTACTS or android.permission.WRITE_CONTACTS
另外:它没有请求我的许可来访问 READ_CONTACTS
和 WRITE_CONTACTS
。
有什么问题?
您正在使用 &&
而不是 ||
。就目前而言,如果您只持有三者之一,则不会要求 任何 运行时权限。
此外,您正在调用 requestPermissions()
三次。使用您需要的任何权限调用一次。 new String[]
创建一个字符串数组,它可以包含您想要的所有三个权限名称。
如果你有 10 个权限,你会把你的代码再扩展 20 行吗?不!
你有两种方法
- 按照正确的方式请求许可。我正在发布我的代码片段,将此代码复制到您的 Base Activity class.
- 或者你使用RxPermissions。如果您是 Android.
的新手
这是我的代码片段。
String[] permissions = {Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS};
getBulkPermissions(permissions, new RequestPermissionAction() {
@Override
public void permissionDenied() {
// TODO: 5/27/2018 handle permission deny
}
@Override
public void permissionGranted() {
// TODO: 5/27/2018 you code do further operations
}
});
能再简单点吗?
现在您可以将此代码放在基础 Activity class 中并在您需要的任何地方使用。或者如果您在其他地方不需要它,请输入您当前的 class。
RequestPermissionAction onPermissionCallBack;
private final static int REQUEST_BULK_PERMISSION = 3006;
private boolean checkBulkPermissions(String[] permissions) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
for (String permission : permissions) {
if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
} else {
return true;
}
}
public void getBulkPermissions(String[] permissions, RequestPermissionAction onPermissionCallBack) {
this.onPermissionCallBack = onPermissionCallBack;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!checkBulkPermissions(permissions)) {
requestPermissions(permissions, REQUEST_BULK_PERMISSION);
return;
}
}
if (onPermissionCallBack != null)
onPermissionCallBack.permissionGranted();
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
if (onPermissionCallBack != null)
onPermissionCallBack.permissionGranted();
} else if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_DENIED) {
if (onPermissionCallBack != null)
onPermissionCallBack.permissionDenied();
}
}
public interface RequestPermissionAction {
void permissionDenied();
void permissionGranted();
}
我有此代码可获得以下权限(READ_PHONE_STATE, READ_CONTACTS, WRITE_CONTACTS):
int permissionCheck = ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_PHONE_STATE);
int permissionCheck1 = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS);
int permissionCheck2 = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_CONTACTS);
if (permissionCheck != PackageManager.PERMISSION_GRANTED && permissionCheck1 != PackageManager.PERMISSION_GRANTED && permissionCheck2 != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.READ_PHONE_STATE}, 1);
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, 2);
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_CONTACTS}, 3);
} else {
TelephonyManager tMgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
mPhoneNumber = tMgr.getLine1Number();
}
我知道我没有这些权限,因为我收到如下错误消息:
java.lang.SecurityException: Permission Denial: opening provider com.android.providers.contacts.ContactsProvider2 from ProcessRecord{95e4cb4 30797:com.example.ortel.tagnet/u0a217} (pid=30797, uid=10217) requires android.permission.READ_CONTACTS or android.permission.WRITE_CONTACTS
另外:它没有请求我的许可来访问 READ_CONTACTS
和 WRITE_CONTACTS
。
有什么问题?
您正在使用 &&
而不是 ||
。就目前而言,如果您只持有三者之一,则不会要求 任何 运行时权限。
此外,您正在调用 requestPermissions()
三次。使用您需要的任何权限调用一次。 new String[]
创建一个字符串数组,它可以包含您想要的所有三个权限名称。
如果你有 10 个权限,你会把你的代码再扩展 20 行吗?不!
你有两种方法
- 按照正确的方式请求许可。我正在发布我的代码片段,将此代码复制到您的 Base Activity class.
- 或者你使用RxPermissions。如果您是 Android. 的新手
这是我的代码片段。
String[] permissions = {Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS};
getBulkPermissions(permissions, new RequestPermissionAction() {
@Override
public void permissionDenied() {
// TODO: 5/27/2018 handle permission deny
}
@Override
public void permissionGranted() {
// TODO: 5/27/2018 you code do further operations
}
});
能再简单点吗?
现在您可以将此代码放在基础 Activity class 中并在您需要的任何地方使用。或者如果您在其他地方不需要它,请输入您当前的 class。
RequestPermissionAction onPermissionCallBack;
private final static int REQUEST_BULK_PERMISSION = 3006;
private boolean checkBulkPermissions(String[] permissions) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
for (String permission : permissions) {
if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
} else {
return true;
}
}
public void getBulkPermissions(String[] permissions, RequestPermissionAction onPermissionCallBack) {
this.onPermissionCallBack = onPermissionCallBack;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!checkBulkPermissions(permissions)) {
requestPermissions(permissions, REQUEST_BULK_PERMISSION);
return;
}
}
if (onPermissionCallBack != null)
onPermissionCallBack.permissionGranted();
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
if (onPermissionCallBack != null)
onPermissionCallBack.permissionGranted();
} else if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_DENIED) {
if (onPermissionCallBack != null)
onPermissionCallBack.permissionDenied();
}
}
public interface RequestPermissionAction {
void permissionDenied();
void permissionGranted();
}