Android 6.0 permission.GET_ACCOUNTS

38

我在使用这个来获得许可:

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.
    }
}

但是请求权限的弹出对话框要求用户访问联系人!?!?

在6.0之前的Play Store中。

<uses-permission android:name="android.permission.GET_ACCOUNTS"/>

请求被命名为Identity并解释了我需要它来获取设备帐户。


你有什么问题? - Kuffs
2
重要的附注:GET_ACCOUNTS 的文档说明,如果你只用于自己的账户,可以移除该权限。 - oli
1
在6.0以上的Android版本中,您不需要请求GET_ACCOUNTS权限以使解析推送正常工作。它在清单文件中声明,以便支持Android 4.04及以下版本。 - jiawen
6个回答

37
因为权限组的原因,这就是说,权限被分成不同的组,如果其中一个权限被授予,则该组中的所有权限都将被授予。
例如,在“联系人”下,有写入/读取联系人和获取帐户等内容,因此当您请求其中任何一个时,弹出窗口会要求获得联系人权限。
阅读:Android运行时权限中每个Android开发者都必须了解的内容

编辑1

我想补充一下与账户无关但与权限和组相关的奥利奥更新信息:
来源:https://developer.android.com/about/versions/oreo/android-8.0-changes.html#rmp

在 Android 8.0(API 级别 26)之前,如果应用程序在运行时请求了某个权限并且被授予了该权限,则系统还会错误地授予该应用程序属于同一权限组且在清单中注册的其余权限。

对于针对 Android 8.0 的应用程序,已经更正了此行为。该应用程序仅被授予它明确请求的权限。但是,一旦用户向应用程序授予了某个权限,则自动授予该权限组中所有后续权限请求。



写入/读取存储不在联系人下,而是在android.permission-group.Storage下。在联系人下有读取/写入联系人。 - Karol Żygłowicz
正确的...已纠正...不是存储...联系人。 - Pararth
10
这种事情让我怀疑谷歌。通讯录是一项非常重要的权限,它保护了数百个人的私人信息访问。相比之下,GET_ACCOUNTS权限几乎没有意义。现在我必须停止在我的应用程序中使用GET_ACCOUNTS权限。 - Tom
2
是的,我认为Google/Android在安装之前不给予所有权限和在运行时不要求太多单独权限之间陷入了困境。然后它最终找到了一个折中的解决方案。 - Pararth

19

9
太糟糕了。我注意到人们也在这里抱怨:https://code.google.com/p/android/issues/detail?id=189766 。我使用它来将有效负载数据添加到应用内付费机制中。 - android developer
6
对于那些仅在自己的帐户上使用权限的人,有一个解决方法:https://code.google.com/p/android/issues/detail?id=189766#c8 - tbruyelle
@tbruyelle,你知道“他们自己的账户”是指由请求GET_ACCOUNTS权限的应用程序创建的帐户,还是指用户帐户,即仅由应用程序用户拥有的帐户吗? - ShawnFeatherly
@androiddeveloper:也许我记错了。 - CommonsWare
@CommonsWare 我认为这可能与通讯录上的各种查询得到不同账户类型值有关。 - android developer
显示剩余3条评论

9

2
你能再检查一下链接吗?我在那里找不到引用的文本。希望 Google 没有改变废弃它的想法... - snark
1
我百分之百确定在 https://developer.android.com 的新设计之前它是存在的。 - ibmkhd
1
同样的问题,文本已经改变了!其实知道这些信息是否仍然正确会很好。 - Simon Fakir
是的,正确的。我也有同样的感觉。在我的Android应用中,我的targetSdkVersion是24,当我使用GET_ACCOUNTS时,我没有收到任何安全异常。 - Anshul Agarwal
看起来并没有被弃用。在某些情况下仍然可以使用:https://developer.android.com/about/versions/oreo/android-8.0-changes.html#aaad - android developer

2

1

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

这样可以避免弹出联系人权限请求框


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接