デバイスにアカウントを追加し、ログイン画面を提供する 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"/>
追加の権限付与なしでユーザー アカウントのユーザー名とトークンを取得できますが、アカウントの削除は機能しません。私は本当に助けていただければ幸いです!