我用这个来获得许可:
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"/>
请求被命名为Identity并解释我需要它来获取设备帐户。
答案 0 :(得分:33)
那是因为权限组。基本上,权限放在不同的组下,如果授予其中一个权限,则授予该组的所有权限。
EG。在&#34;联系人&#34; ,有写/读联系人和获取帐户,所以当你要求任何这些时,弹出窗口会询问联系人权限。
通读:Everything every Android Developer must know about new Android's Runtime Permission
编辑1
只是想我添加相关(不是获取帐户,但权限和群组)奥利奥更新信息:
来源:https://developer.android.com/about/versions/oreo/android-8.0-changes.html#rmp
在Android 8.0(API级别26)之前,如果某个应用请求了权限 在运行时并且授予了权限,系统也是错误的 授予应用程序其他属于同一权限的权限 权限组,以及在清单中注册的。
对于定位到Android 8.0的应用,此行为已得到纠正。该 应用程序仅被授予其明确请求的权限。 但是,一旦用户授予应用程序权限,所有后续操作 该权限组中的权限请求是自动的 理所当然的。
答案 1 :(得分:18)
GET_ACCOUNTS
was moved into the CONTACTS
permission group in Android 6.0。虽然API让我们提供权限,但系统会提示用户(至少为Android 6.0)提供权限组。因此,系统会向用户提供与GET_ACCOUNTS
或READ_CONTACTS
用户相同的WRITE_CONTACTS
提示。
答案 2 :(得分:6)
幸运的是,这将在Android N中发生变化
http://developer.android.com/preview/behavior-changes.html#perm
现已弃用GET_ACCOUNTS权限。系统忽略了这一点 针对Android N的应用的权限。
答案 3 :(得分:2)
在Marshmallow中,所有危险权限都属于权限组。
权限android.permission.GET_ACCOUNTS
属于CONTACTS群组
您可以在此处找到有关危险许可及其群组的更多信息:
https://developer.android.com/guide/topics/security/permissions.html#normal-dangerous
答案 4 :(得分:1)
我先把你的问题弄错了。在此页http://developer.android.com/guide/topics/security/permissions.html#perm-groups上,您可以看到GET_ACCOUNTS是指权限组联系人。因此,系统会提示您提供联系人权限。
答案 5 :(得分:0)
如果您使用GET_ACCOUNTS权限要求用户选择设备上的特定帐户类型(在我的情况下为Google),则可以使用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依赖项中需要Google Play服务身份验证
implementation com.google.android.gms:play-services-auth:16.0.1
这避免了我的“联系人”权限弹出窗口