Android M 6.0 - SecurityException Попытка удалить учетные записи
У меня есть приложение, которое использует 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) > Разрешения" Я вижу только два разрешения, "Телефон" "Хранение".
Я заметил, что при компиляции с SDK 23 и нацеливания 23: я вижу три разрешения: "Телефон", "Хранилище" и "Контакты".
Я пробовал следующее:
Переключение на компиляцию с 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"/>
Я могу получить имя пользователя и токен учетной записи пользователя без дополнительных разрешений, но удаление учетных записей не работает. Буду очень признателен за любую помощь!
3 ответа
Я знаю, что уже поздно отвечать, но я подумала, что поделюсь своими результатами, если кто-то еще окажется в такой же ситуации.
Я обновил свою сборку до 23 вместо 22, поскольку не смог решить 22. Затем я явно запросил разрешение во время выполнения для GET_ACCOUNTS, прежде чем пытаться что-либо с ними делать. https://developer.android.com/training/permissions/requesting.html https://developer.android.com/reference/android/Manifest.permission.html
Дополнительная информация для компиляции с 23: Вам не нужно спрашивать разрешения, если приложение разделяет подпись аутентификатора, который управляет учетной записью. В этом случае мои подписи не совпадали, поэтому мне нужно было запросить это. Если вы создаете учетную запись в своем приложении для использования в своем приложении, вам не нужно запрашивать разрешение во время выполнения.
Проверяя исходный код, вы можете удалить учетные записи в двух случаях:
- учетная запись создается вашим приложением
- ваше приложение является системным
Для зефира вам нужно добавить права пользователя во время выполнения. Вы можете проверить этот URL
Я внезапно застрял в том же самом вчера. В моем случае я определил неправильное имя пакета в узле. Просто исправьте это, и оно будет отлично работать.
<account-authenticator>
xmlns:android="http://schemas.android.com/apk/res/android"
android:accountType="Your correct packet name here" + ".accounts"
android:icon="@drawable/ic_launcher"
android:label="xxx"
android:smallIcon="@drawable/ic_launcher"
>
</account-authenticator>
Если ваше имя пакета: com.example.android
тогда тип учетной записи должен быть: com.example.android.accounts