无法从具有相同身份验证器的不同应用程序添加新的自定义帐户

Cannot add new custom account from different app with same authenticator

我有两个应用都使用相同的自定义帐户类型。这两个应用程序是完全独立的,只是共享一个帐户。当其中之一启动时,它会检查现有的自定义帐户,如果未找到帐户,则会显示登录页面。

所以我创建了我的 AccountAuthenticator 作为一个库项目,并在两个应用程序中引用它。根据这个tutorial:

Let’s say you copied your authenticator’s code to 2 of your apps, thus sharing its logic, and altering the sign-in pages design on each app to fit the app it belongs to. In that case, the first installed app’s authenticator will be called for both apps when an auth-token will be requested. If you uninstall the first app, the second app’s authenticator will be called from now on (since it’s the only one now).

当我 运行 其中一个应用程序(无论是哪个应用程序)并调用 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);

提前致谢

我不确定这是正确的答案,但我发现问题在于应用程序具有不同的 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" >

@Misagh Emamverdi 是的。您在清单中缺少该权限。

android:sharedUserId

将与其他应用程序共享的 Linux 用户 ID 的名称。默认情况下,Android 为每个应用程序分配自己唯一的用户 ID。但是,如果为两个或多个应用程序将此属性设置为相同的值,则它们将共享相同的 ID — 前提是它们也由相同的证书签名。

具有相同用户 ID 的应用程序可以访问彼此的数据,如果需要,还可以在同一进程中运行。

所以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"] >
. . .

找到写得好的文章Write your own Android Authenticator