我使用这个获得许可:
if (ContextCompat.checkSelfPermission(context, Manifest.permission.GET_ACCOUNTS) != PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(context, Manifest.permission.GET_ACCOUNTS)) {
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(context, new String[]{Manifest.permission.GET_ACCOUNTS}, PERMISSIONS_REQUEST_GET_ACCOUNTS);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant. The callback method gets the
// result of the request.
}
}
但是,对于允许弹出对话框询问用户访问联系人!?!?
在Play商店前6.0
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
请求被命名身份,并解释我需要它来获取设备的帐户。
这是因为权限组。基本上,权限被放置在不同的基团,并且如果它们中的一个被授予从该组的所有权限将被授予。
例如。在“联系人”,有读/写接触,并得到账户,所以当你问任何那些,弹出询问联系方式的权限。
通读:Everything every Android Developer must know about new Android's Runtime Permission
编辑1
只是想i'l添加相关(未获得帐户,但权限和组)奥利奥更新信息: 来源:https://developer.android.com/about/versions/oreo/android-8.0-changes.html#rmp
到Android 8.0(API级26)中,如果一个应用程序请求的许可在运行时和权限被授予,该系统还错误地授予的应用程序,属于相同的权限组的权限的其余部分,并且被登记在现有表现。
对于应用定位的Android 8.0,此行为已得到纠正。该应用程序被授予唯一已经明确要求的权限。然而,一旦用户授予应用程序权限,该权限组中的权限的所有后续请求将被自动授予。
GET_ACCOUNTS
was moved into the CONTACTS
permission group in Android 6.0。虽然API有我们提供的权限,用户(针对Android 6.0至少)被提示输入权限组。因此,用户将获得GET_ACCOUNTS
作为用户相同的提示将获得READ_CONTACTS
或WRITE_CONTACTS
。
还好,这将在Android的n切换
http://developer.android.com/preview/behavior-changes.html#perm
该GET_ACCOUNTS许可,现在已经过时。该系统会忽略此权限适用于Android应用N.
在棉花糖所有危险的权限属于权限组。
该许可android.permission.GET_ACCOUNTS
属于CONTACTS组
您可以找到有关风险的权限和他们的小组在这里的详细信息: https://developer.android.com/guide/topics/security/permissions.html#normal-dangerous
我得到了你的问题错在先。在这个页面上http://developer.android.com/guide/topics/security/permissions.html#perm-groups,你可以看到,GET_ACCOUNTS指权限组联系人。正因为如此你被提示输入联系人的权限。
如果您使用GET_ACCOUNTS权限要求用户选择设备(谷歌在我的情况),在一个特定的帐户类型,您可以使用AccountPicker类不需要任何特殊权限
Intent intent = AccountPicker.newChooseAccountIntent(null, null,
new String[]{GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE},
false, null, null, null, null);
try {
startActivityForResult(intent, REQUEST_ACCOUNT_PICKER);
} catch (ActivityNotFoundException e) {
// This device may not have Google Play Services installed.
}
你需要谷歌播放服务身份验证在你的gradle这个依赖
implementation com.google.android.gms:play-services-auth:16.0.1
这避免了联系人权限弹出我