7

デバイスにアカウントを追加し、ログイン画面を提供する Android AccountManager (パッケージ名: com.mycompany.accounts) を使用するアプリがあります。最初のアプリを使用してアカウントを追加/削除する別のアプリ (com.mycomp.actualapp) があります。

マニフェストで次のアクセス許可を使用して、Pre Marshmallow デバイスでアカウントを正常に追加および削除できます。

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

SDK 22 でコンパイルし、SDK 22 を対象とする場合、これらの権限は自動的に付与されます。次のコード:

      accountManager.removeAccount(getAccount(), activity, new AccountManagerCallback<Bundle>() {
        @Override
        public void run(AccountManagerFuture<Bundle> accountManagerFuture) {
            try {
                Bundle bundle = accountManagerFuture.getResult();
                boolean success = bundle.getBoolean(AccountManager.KEY_BOOLEAN_RESULT);
                if (success) {
                    Toast.makeText(activity, activity.getString(R.string.successfully_loggedout), Toast.LENGTH_LONG).show();
                    afterLogoutSuccess(activity);

                } else {
                    Toast.makeText(activity.getApplicationContext(), activity.getString(R.string.failed_to_logout), Toast.LENGTH_LONG).show();
                }
                onLogoutListener.onLogoutFinished(success);
                return;
            } catch (OperationCanceledException e) {
                Log.e(TAG,"Operation cancelled exception:", e);
            } catch (IOException e) {
                Log.e(TAG, "IOException:", e);
            } catch (AuthenticatorException e) {
                Log.e(TAG, "AuthenticatorException:", e);
            }
            onLogoutListener.onLogoutFinished(false);

        }
    }, null);

次の例外で失敗します。

 java.lang.SecurityException: uid 10057 cannot remove accounts of type: com.mycompany.accounts
        at android.os.Parcel.readException(Parcel.java:1599)
        at android.os.Parcel.readException(Parcel.java:1552)
        at android.accounts.IAccountManager$Stub$Proxy.removeAccount(IAccountManager.java:897)
        at android.accounts.AccountManager$7.doWork(AccountManager.java:900)
        at android.accounts.AccountManager$AmsTask.start(AccountManager.java:1888)
        at android.accounts.AccountManager.removeAccount(AccountManager.java:897)
        at com.mycomp.actualapp.utils.LoginHelper$4.doInBackground(LoginHelper.java:282)
        at com.mycomp.actualapputils.LoginHelper$4.doInBackground(LoginHelper.java:242)
        at android.os.AsyncTask$2.call(AsyncTask.java:295)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
        at java.lang.Thread.run(Thread.java:818)

奇妙なことに、このコードは Pre Marshmallow デバイスで問題なく正常に動作します。

ちなみに、sdk 22 でコンパイルし、22 をターゲットにしていることに気付きました。「設定 > アプリ > マイ アプリ (com.mycomp.actualapp) > アクセス許可」に移動すると、「電話」「ストレージ」の 2 つのアクセス許可しか表示されません。

SDK 23 でコンパイルし、23 をターゲットにしていることに気付きました。「電話」、「ストレージ」、「連絡先」の 3 つの権限が表示されます。

私は次のことを試しました:

  • SDK 23 でコンパイルするように切り替えます - アプリの設定ですべての権限を付与し、アカウントの削除をもう一度お試しください。同じ例外でまだ失敗します。

  • 22 でコンパイルし、次の権限をマニフェストに追加します。すべての権限が付与されていることを確認してください。それでも同じ例外で失敗します:

    <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"/>
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>

追加の権限付与なしでユーザー アカウントのユーザー名とトークンを取得できますが、アカウントの削除は機能しません。私は本当に助けていただければ幸いです!

4

3 に答える 3

1

回答が遅れていることは承知していますが、他の誰かが同じ状況にある場合に備えて、調査結果を共有すると思いました.

22 では解決できなかったため、22 ではなく 23 でビルドするようにビルドをアップグレードしました。次に、実行時に GET_ACCOUNTS へのアクセス許可を明示的に要求してから、何かを実行しようとしました。 https://developer.android.com/training/permissions/requesting.html https://developer.android.com/reference/android/Manifest.permission.html#GET_ACCOUNTS

23 でコンパイルするための詳細情報:アカウントを管理する認証者の署名をアプリが共有する場合、許可を求める必要はありません。この場合、署名が一致しなかったため、署名を要求する必要がありました。アプリ内で使用するアカウントをアプリ内で作成する場合、実行時にパーミッションをリクエストする必要はありません

于 2016-12-31T12:55:09.293 に答える
0

ソース コードを確認すると、次の 2 つの場合に removeAccounts を実行できます。

  1. アカウントはアプリによって作成されます
  2. あなたのアプリはシステムアプリです

ソース: https://android.googlesource.com/platform/frameworks/base/+/05c9ecc/services/core/java/com/android/server/accounts/AccountManagerService.java#1336

于 2019-08-09T09:33:52.220 に答える