READ_CONTACTS 权限无效,除非我在 android SDK 23+ 上手动将其关闭和打开
READ_CONTACTS permission is not working unless i manually turn it off & on on 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
);
& 来自 activity 的权限调用如下:
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();
}
};
在早期的 Android 版本中有一个 "bug",一旦您在一个组中请求一个权限,您将被自动授予整个组。
因此,如果您的应用程序需要 READ_CONTACTS + WRITE_CONTACTS,那么请求 READ_CONTACTS 许可就足以同时获得这两者。
从 Android SDK 26 开始,此问题已得到修复以更好地反映文档,因此您需要请求所有您感兴趣的权限才能获得它们,因此这段代码:
new String[] { permission.permission }
应该有:
new String[] { Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS }
(如何用你的 enum
东西来实现这个取决于你)
我正在开发一个需要显示用户联系人图片(如果可用)的应用程序。
下面是请求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
);
& 来自 activity 的权限调用如下:
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();
}
};
在早期的 Android 版本中有一个 "bug",一旦您在一个组中请求一个权限,您将被自动授予整个组。
因此,如果您的应用程序需要 READ_CONTACTS + WRITE_CONTACTS,那么请求 READ_CONTACTS 许可就足以同时获得这两者。 从 Android SDK 26 开始,此问题已得到修复以更好地反映文档,因此您需要请求所有您感兴趣的权限才能获得它们,因此这段代码:
new String[] { permission.permission }
应该有:
new String[] { Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS }
(如何用你的 enum
东西来实现这个取决于你)