11

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

所以我创建了我AccountAuthenticator的库项目并在两个应用程序中引用它。根据本教程

假设您将身份验证器的代码复制到您的 2 个应用程序中,从而共享其逻辑,并更改每个应用程序的登录页面设计以适应其所属的应用程序。在这种情况下,当请求 auth-token 时,将为两个应用程序调用第一个安装的应用程序的身份验证器。如果您卸载第一个应用程序,将从现在开始调用第二个应用程序的验证器(因为它现在是唯一的)。

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

提前致谢

4

3 回答 3

4

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

安卓: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"] >
. . .

于 2015-09-08T09:34:09.623 回答
3

我不确定这是正确的答案,但我发现问题在于应用程序具有不同的 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" >
于 2015-09-07T04:55:40.977 回答
3

找到写得很好的文章编写你自己的 Android Authenticator

在此处输入图像描述

于 2015-09-10T10:57:18.400 回答