在Android 6.0 permission.GET_ACCOUNTS

问题描述 投票:35回答:6

我使用这个获得许可:

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"/>

请求被命名身份,并解释我需要它来获取设备的帐户。

android permissions android-6.0-marshmallow
6个回答
34
投票

这是因为权限组。基本上,权限被放置在不同的基团,并且如果它们中的一个被授予从该组的所有权限将被授予。

例如。在“联系人”,有读/写接触,并得到账户,所以当你问任何那些,弹出询问联系方式的权限。

通读: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,此行为已得到纠正。该应用程序被授予唯一已经明确要求的权限。然而,一旦用户授予应用程序权限,该权限组中的权限的所有后续请求将被自动授予。



18
投票

GET_ACCOUNTS was moved into the CONTACTS permission group in Android 6.0。虽然API有我们提供的权限,用户(针对Android 6.0至少)被提示输入权限组。因此,用户将获得GET_ACCOUNTS作为用户相同的提示将获得READ_CONTACTSWRITE_CONTACTS


7
投票

还好,这将在Android的n切换

http://developer.android.com/preview/behavior-changes.html#perm

该GET_ACCOUNTS许可,现在已经过时。该系统会忽略此权限适用于Android应用N.


2
投票

在棉花糖所有危险的权限属于权限组。

该许可android.permission.GET_ACCOUNTS属于CONTACTS

您可以找到有关风险的权限和他们的小组在这里的详细信息: https://developer.android.com/guide/topics/security/permissions.html#normal-dangerous


1
投票

我得到了你的问题错在先。在这个页面上http://developer.android.com/guide/topics/security/permissions.html#perm-groups,你可以看到,GET_ACCOUNTS指权限组联系人。正因为如此你被提示输入联系人的权限。


0
投票

如果您使用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

这避免了联系人权限弹出我

© www.soinside.com 2019 - 2024. All rights reserved.