Android 6.0权限.GET_ACCOUNTS

时间:2015-10-14 12:10:28

标签: android permissions android-6.0-marshmallow

我用这个来获得许可:

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并解释我需要它来获取设备帐户。

6 个答案:

答案 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_ACCOUNTSREAD_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

这避免了我的“联系人”权限弹出窗口