Я получил вышеуказанное исключение при попытке реализовать приложение Sample Sync Adapter. Я видел множество сообщений, связанных с этой проблемой, но не получил удовлетворительного ответа.
Поэтому я запишу здесь свое решение на случай, если кто-то еще столкнется с той же проблемой.
Ответы:
Еще несколько полезных советов по устранению подобных проблем.
Сначала включите подробное ведение журнала для некоторых тегов:
$ adb shell setprop log.tag.AccountManagerService VERBOSE $ adb shell setprop log.tag.Accounts VERBOSE $ adb shell setprop log.tag.Account VERBOSE $ adb shell setprop log.tag.PackageManager VERBOSE
Вы увидите такой журнал:
V/AccountManagerService: initiating bind to authenticator type com.example.account V/Accounts: there is no service connection for com.example.account V/Accounts: there is no authenticator for com.example.account, bailing out D/AccountManagerService: bind attempt failed for Session: expectLaunch true, connected false, stats (0/0/0), lifetime 0.002, addAccount, accountType com.example.account, requiredFeatures null
Это означает, что для этого типа учетной записи не зарегистрирован аутентификатор. Чтобы узнать, какие аутентификаторы зарегистрированы, просмотрите журнал при установке пакета:
D/PackageManager: encountered new type: ServiceInfo: AuthenticatorDescription {type=com.example.account}, ComponentInfo{com.example/com.example.android.AuthenticatorService}, uid 10028 D/PackageManager: notifyListener: AuthenticatorDescription {type=com.example.account} is added
У меня была проблема, что XML-дескриптор аутентификатора ссылался на строковый ресурс, который не был разрешен должным образом во время установки:
android:accountType="@string/account_type"
Журналы показали
encountered new type: ServiceInfo: AuthenticatorDescription {type=@2131231194}, ...
Замена его на обычную строку (не ресурс) решила проблему. Это похоже на Android 2.1.
android:accountType="com.example.account"
источник
Сначала проверьте условие, описанное в этом посте :
[...] Если вы видите ошибку в
AccountManagerService
формеcaller uid XXXX is different than the authenticator's uid
, это может ввести в заблуждение. «Аутентификатор» в этом сообщении - это не ваш класс аутентификатора, а то, что Android понимает как зарегистрированный аутентификатор для типа учетной записи. Проверка, которая происходит внутри,AccountManagerService
выглядит так:private void checkCallingUidAgainstAuthenticator(Account account) { final int uid = Binder.getCallingUid(); if (account == null || !hasAuthenticatorUid(account.type, uid)) { String msg = "caller uid " + uid + " is different than the authenticator's uid"; Log.w(TAG, msg); throw new SecurityException(msg); } if (Log.isLoggable(TAG, Log.VERBOSE)) { Log.v(TAG, "caller uid " + uid + " is the same as the authenticator's uid"); } }
Обратите внимание, что
hasAuthenticatorUid()
принимает расширениеaccount.type
. Вот где я облажался. Я создавал свойAccount
с типом, указанным константой:class LoginTask { Account account = new Account(userId, AuthenticatorService.ACCOUNT_TYPE); ... } class AuthenticatorService extends Service { public static final String ACCOUNT_TYPE = "com.joelapenna.foursquared"; ... }
но эта константа не соответствовала определению XML для моего аутентификатора:
<account-authenticator xmlns:android="/web/20150729061818/http://schemas.android.com/apk/res/android" android:accountType="com.joelapenna.foursquared.account" ... />
Во-вторых, если вы похожи на меня и хотите встроить образец в существующее приложение для тестирования, убедитесь, что вы используете
Constants
класс, который является частью этого примера, а не входит вandroid.provider.SyncStateContract
пакет. Поскольку оба класса используют то же имя атрибутаACCOUNT_TYPE
, которое используется при созданииAccount
объекта.источник
В моем случае проблема заключалась в простом несоответствии в accountType, объявленном в
res/xml/authenticator.xml
as,android:accountType="com.foo"
но неправильно"foo.com"
указанном, как при создании учетной записи:Account newAccount = new Account("dummyaccount", "foo.com");
Дох!
источник
Есть несколько частей для реализации настраиваемой учетной записи ...
Чтобы вызвать AccountManager в своей деятельности, вы уже реализовали нечто подобное ...
Account account = new Account(username, ACCESS_TYPE); AccountManager am = AccountManager.get(this); Bundle userdata = new Bundle(); userdata.putString("SERVER", "extra"); if (am.addAccountExplicitly(account, password, userdata)) { Bundle result = new Bundle(); result.putString(AccountManager.KEY_ACCOUNT_NAME, username); result.putString(AccountManager.KEY_ACCOUNT_TYPE, ACCESS_TYPE); setAccountAuthenticatorResult(result); }
В res / xml / Authenticator.xml вы должны определить данные вашего AccountAuthenticator (отвечающие за ваш UID Authenticator). ACCESS_TYPE должен быть той же строкой, что и ваш определенный тип accountType в этом xml!
<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android" android:accountType="de.buecherkiste" android:icon="@drawable/buecher" android:label="@string/app_name" android:smallIcon="@drawable/buecher" > </account-authenticator>
Наконец, вы должны определить свою службу Manifest. Не забудьте соответствующие разрешения для управления своими учетными записями (AUTHENTICATE_ACCOUNTS / USE_CREDENTIALS / GET_ACCOUNTS / MANAGE_ACCOUNTS)
<service android:name=".AuthenticationService"> <intent-filter> <action android:name="android.accounts.AccountAuthenticator" /> </intent-filter> <meta-data android:name="android.accounts.AccountAuthenticator" android:resource="@xml/authenticator" /> </service>
источник
Моя ошибка заключалась в том, что метод AccountManager getAccounts () возвращал учетные записи, связанные только с контекстом моего приложения. Я изменил с
AccountManager accountManager = AccountManager.get(context); Account[] accounts = accountManager.getAccounts();
к
AccountManager accountManager = AccountManager.get(context); Account[] accounts = accountManager.getAccountsByType(Constants.ACCOUNT_TYPE);
источник
Та же ошибка появится, если вы укажете неверные значения в фильтрах намерений в манифесте. Я прошел через руководство по android-dev по адаптерам синхронизации и в итоге установил фиктивное значение для «intent-filter / action android: name», а также «meta-data / android: name» для syncadapter / accountauthenticator. Эта ошибка вызвала появление тех же ошибок в журналах.
Для записи правильные значения: {android.content.SyncAdapter, android.accounts.AccountAuthenticator}
источник
Убедитесь, что XML-код вашей службы указывает правильное местоположение.
Например, если ваше имя модуля
вы обслуживаете андроид: имя должно быть
<service android:name=".module.auth.name-of-authenticator-service-class"...
в AndriodManifest.xml
источник
Прежде всего, еще раз взгляните на отличный совет Яна Беркеля по отладке.
Наконец, еще одна вещь, которую следует проверить, - это то, что ваш поставщик контента и службы аутентификации и синхронизации объявлены дочерними по отношению к
application
тегу.<application ...> <activity ...(Activity)... </activity> <provider ...(CP service declaration)/> <service ...(Authentication service declaration)... </service> <service ...(Sync service declaration)... </service> </application>
источник
Для меня это была очень глупая ошибка, и ее было очень трудно найти.
В Authenticator.xml я написал
<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"> xmlns:android="http://schemas.android.com/apk/res/android" android:accountType="com.myapp" android:icon="@drawable/ic_launcher" android:smallIcon="@drawable/ic_launcher" android:label="@string/app_name" />
вместо
<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android" android:accountType="com.myapp" android:icon="@drawable/ic_launcher" android:smallIcon="@drawable/ic_launcher" android:label="@string/app_name" />
что вызывало эту ошибку. Надеюсь, это кому-то поможет!
источник
В моем случае это были разрешения в файле манифеста, которые у меня были
<uses-permission android:name="ANDROID.PERMISSION.GET_ACCOUNTS"/>
все было заглавными буквами, когда я изменил его на
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
проблема исчезла
источник
Также,
Проверьте, не слишком ли вы относитесь к AccountType как к старой простой строке.
У меня большая часть моего кода упакована в com.mycompany.android
Я успешно использовал следующий тип учетной записи : com.mycompany.android.ACCOUNT .
Теперь у меня есть желание использовать несколько учетных записей, и когда я пытаюсь добавить ".subType" в конец моей учетной записи, это не удается.
Однако, если я использую «_subType» (подчеркивание вместо точки), он работает нормально.
Я предполагаю, что где-то под капотом Android пытается рассматривать com.mycompany.android.ACCOUNT как законное имя пакета, что, безусловно, не является.
Итак, еще раз:
ПЛОХО com.mycompany.android.ACCOUNT.subType
ХОРОШО com.mycompany.android.ACCOUNT_subType
источник
Если вы получаете эту ошибку, и все вышеперечисленные решения не работают для вас. Кроме того, вы предполагаете, что выполнили всю процедуру. Возможно, служба аутентификации разработана другим разработчиком, и вы захотите использовать его для добавления учетных записей.
Что вы можете попробовать, так это попробовать подписать свое приложение с помощью хранилища ключей выпуска. Теперь вы запускаете приложение. Я полагаю, это должно сработать для вас.
источник
Вот еще одно возможное решение.
У меня была эта ошибка, когда мой пользователь был зарегистрирован в моем приложении с тем же адресом электронной почты, что и его учетная запись android google.
Итак, когда я попытался
accountManager.getAccounts()
найти это письмо, я нашел учетную запись с тем же адресом электронной почты, НО с другим типом учетной записи. Итак, при попытке использовать эту учетную запись (google.com) я получаю эту ошибку.Итак, правильный способ найти учетную запись:
public Account findAccount(String accountName) { for (Account account : accountManager.getAccounts()) if (TextUtils.equals(account.name, accountName) && TextUtils.equals(account.type, "myservice.com")) return account; return null; }
источник
accountManager.getAccountsByType("myservice.com")
вместо этого позвонить .Также убедитесь, что ваш AccountAuthenticatorService имеет фильтры намерений проверяющего;
т.е.
<service android:name=".service.AccountAuthenticatorService"> <intent-filter> <action android:name="android.accounts.AccountAuthenticator" /> </intent-filter> <meta-data android:name="android.accounts.AccountAuthenticator" android:resource="@xml/authenticator" /> </service>
источник
Если вы получаете это исключение на устройствах Samsung, убедитесь, что вы не используете безопасный режим .
источник
Если одни и те же приложения находятся в разных магазинах, например, в магазине приложений Amazon и магазине Google Play, в конечном итоге будет выбрано исключение безопасности, поскольку в этом случае подпись приложений будет другой. Если вы планировали использовать один и тот же аутентификатор для единой войдите в систему, одно из приложений выйдет из строя. однажды я столкнулся с этой проблемой. В частности, магазин приложений Amazon будет подписывать свои приложения своей собственной подписью в целях безопасности.
Примечание. Если здесь нет ошибок с опечаткой или других ответов, пожалуйста, проверьте подпись приложений в случае единого входа.
источник
Для тех, кто все еще сталкивается с проблемой: https://stackoverflow.com/a/37102317/4171098
источник