Невозможно добавить новую настраиваемую учетную запись из другого приложения с тем же аутентификатором

У меня есть два приложения, которые используют один и тот же настраиваемый тип учетной записи. Эти два приложения полностью независимы и просто делят учетную запись. Когда один из них запускается, он проверяет наличие пользовательских учетных записей, и если учетная запись не найдена, отображается страница входа.

Итак, я создал мой AccountAuthenticator в качестве проекта библиотеки и ссылаюсь на него в обоих приложениях. В соответствии с этим учебник:

Допустим, вы скопировали свой код аутентификации в 2 ваших приложениях, таким образом разделяя его логику и изменяя дизайн входных страниц в каждом приложении чтобы соответствовать приложению, к которому он принадлежит. В этом случае первые установленные приложения аутентификатор будет вызываться для обоих приложений, когда токен аутентификации будет просил. Если вы удалите первое приложение, то второе приложение с этого момента будет вызываться аутентификатор (поскольку его единственный в настоящее время).

Когда я запускаю одно из приложений (независимо от того, какое приложение) и вызывает addAccount, он хорошо показывает страницу входа. Затем, когда я запускаю второе приложение и вызываю addAccount, ничего не происходит, и страница входа не отображается. После удаления первого приложения второе приложение работает правильно и показывает страницу входа. Итак, в чем проблема и как я могу это исправить?

Реализация addAccount:

mAccountManager.addAccount(accountType, authTokenType, null, null, this, new AccountManagerCallback<Bundle>() {
            @Override
            public void run(AccountManagerFuture<Bundle> future) {
                try {
                    Bundle bnd = future.getResult();
                    showMessage("Account was created");
                } catch (Exception e) {
                    e.printStackTrace();
                    showMessage(e.getMessage());
                }
            }
        }, null);

Заранее спасибо

Ответ 1

Я не уверен, что это правильный ответ, но я обнаружил, что проблема в том, что приложения имеют разные UID. Поэтому я использую sharedUserId в обоих приложениях, и проблема решена:

 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.test"
    android:sharedUserId="test.account"
    android:versionCode="100"
    android:versionName="1.0" >

Ответ 2

@Misagh Emamverdi Да. Вы не получили этого разрешения в своем манифесте.

Android: sharedUserId

Имя идентификатора пользователя Linux, который будет использоваться совместно с другими приложениями. По умолчанию Android назначает каждому приложению свой уникальный идентификатор пользователя. Однако, если для этого атрибута установлено одно и то же значение для двух или более приложений, все они будут иметь один и тот же идентификатор - при условии, что они также подписаны одним и тем же сертификатом.

Приложение с одним и тем же идентификатором пользователя может обращаться к другим данным и, при желании, работать в одном и том же процессе.

Итак, android: sharedUserId используется для совместного использования процессов между двумя или более приложениями (например Udinic Authenticator).

СИНТАКСИС

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="string"
      android:sharedUserId="string"
      android:sharedUserLabel="string resource" 
      android:versionCode="integer"
      android:versionName="string"
      android:installLocation=["auto" | "internalOnly" | "preferExternal"] >
. . .