web-dev-qa-db-ja.com

Android 6.0 permission.GET_ACCOUNTS

私はこれを使用して許可を取得しています:

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という名前で、デバイスアカウントを取得するために必要だと説明しています。

35
SpyZip

これは、権限グループが原因です。基本的に、アクセス許可は異なるグループの下に配置され、グループのいずれかが許可されると、そのグループのすべてのアクセス許可が許可されます。

例えば。 [連絡先]には、連絡先の書き込み/読み取りとアカウントの取得があります。そのため、これらのいずれかを要求すると、ポップアップが連絡先のアクセス許可を要求します。

読み通す: すべてAndroid開発者は新しいAndroidのランタイムパーミッションについて知っている必要があります


EDIT 1

関連する(アカウントを取得するのではなく、アクセス許可とグループを取得する)オレオの更新情報を追加すると思いました:
ソース: https://developer.Android.com/about/versions/oreo/Android-8.0-changes.html#rmp

Android 8.0(APIレベル26)の前に、アプリが実行時に許可を要求し、許可が許可された場合、システムは同じに属する残りの許可も誤ってアプリに許可しましたマニフェストに登録された許可グループ。

アプリターゲティングAndroid 8.0、この動作は修正されました。アプリは明示的にリクエストしたパーミッションのみが付与されます。ただし、ユーザーがアプリにパーミッションを付与すると、それ以降のパーミッションのリクエストはすべてその許可グループでは自動的に付与されます。


34
Pararth

GET_ACCOUNTSは、Android 6.CONTACTS許可グループに移動されました。APIは許可を提供していますが、ユーザー(Android 6.0以上)許可グループのプロンプトが表示されるため、ユーザーはGET_ACCOUNTSまたはREAD_CONTACTSで取得するのと同じWRITE_CONTACTSのプロンプトが表示されます。

18
CommonsWare

幸いなことに、これはAndroid N

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

GET_ACCOUNTS権限は廃止されました。システムは、Android N.

7
ibmkhd

マシュマロでは、すべての危険な許可は許可グループに属します。

許可Android.permission.GET_ACCOUNTS[〜#〜] contacts [〜#〜] グループに属します

危険な許可とそのグループの詳細については、次を参照してください。
https://developer.Android.com/guide/topics/security/permissions.html#normal-dangerous

2

最初にあなたの質問が間違っていました。このページ http://developer.Android.com/guide/topics/security/permissions.html#perm-groups で、GET_ACCOUNTSが許可グループの連絡先を参照していることがわかります。そのため、連絡先の許可を求められます。

1
Thomas R.

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

これにより、連絡先権限のポップアップが表示されなくなります

0
Jer