android - READ_CONTACTS 权限不起作用,除非我在 android SDK 23+ 上手动关闭和打开它
问题描述
我正在开发一个应用程序,如果可用,我需要显示用户联系人图片。
下面是请求 read_contacts 权限的代码:
public void requestPermissionOrShowRationale(Permission permission) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, permission.permission)) {
PermissionRationaleDialogFragment dialogFragment =
PermissionRationaleDialogFragment.newInstance(permission);
dialogFragment.show(getSupportFragmentManager(), FRAGMENT_TAG_RATIONALE);
} else {
requestPermission(permission);
}
}
public void requestPermission(Permission permission) {
Timber.i("Requesting permission: " + permission.permission);
ActivityCompat.requestPermissions(this, new String[] { permission.permission }, permission.requestCode);
}
public enum Permission {
READ_CONTACTS(
Manifest.permission.READ_CONTACTS,
PERMISSIONS_REQUEST_READ_CONTACTS,
R.string.permission_contacts_rationale_title,
R.string.permission_contacts_rationale_message
),
WRITE_CONTACTS(
Manifest.permission.WRITE_CONTACTS,
PERMISSIONS_REQUEST_WRITE_CONTACTS,
R.string.permission_contacts_rationale_title,
R.string.permission_contacts_rationale_message
);
来自活动的 & 权限调用如下:
private void checkAndRequestPermissions() {
if (!hasPermission(Permission.READ_CONTACTS)) {
requestPermissionOrShowRationale(Permission.READ_CONTACTS);
}
}
当我使用targetsdk 23时,一切正常。将targetsdk更改为26或更高后,权限不起作用。除非我从应用程序权限设置中手动关闭和打开它以获取联系人。
解决方案
我为我的问题找到的超级简单和最佳解决方案是 TedPermission https://github.com/ParkSangGwon/TedPermission
我已经删除了所有现有的权限代码并使用了下面的魔法代码:)
setLayout(R.layout.welcome);
TedPermission.with(this)
.setPermissionListener(permissionlistener)
.setPermissions(Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS)
.setDeniedMessage("This permission is required to show Contact Pictures and Email Address Suggestions.\n\nPlease turn on this permissions at [Setting] > [Permission]")
.check();
PermissionListener permissionlistener = new PermissionListener() {
@Override
public void onPermissionGranted() {
}
}
@Override
public void onPermissionDenied(ArrayList<String> deniedPermissions) {
Toast.makeText(WelcomeMessage.this, "Permission Denied\n" + deniedPermissions.toString(), Toast.LENGTH_SHORT).show();
}
};
推荐阅读
- java - 如何消除 GridBagLayout 中的空白?
- ios - swift 5 自定义单元格图片点击
- excel - 如何使用 Excel VBA 宏使 excel 工作表受保护和不受保护?
- python - 用布尔数组屏蔽opencv bgr的最有效方法
- flutter - Flutter 在现有项目中构建 Web 不断失败
- swift - 了解组合中的 share()
- php - 在foreach中合并数组
- android - 错误:(19) 尝试安装 ADMOB 时,在包 'android' 中找不到属性 'appComponentFactory' 的资源标识符
- c# - 如何在 Access db vs 中按计数和名称选择行
- git - 扩展现有的 git 存储库,并定期、有选择地合并来自主项目的更新