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

Android 无法从具有相同身份验证器的不同应用添加新的自定义帐户,android,account,accountmanager,android-account,android-authenticator,Android,Account,Accountmanager,Android Account,Android Authenticator,我有两个应用程序都使用相同的自定义帐户类型。这两个应用程序完全独立,只需共享一个帐户。当其中一个帐户启动时,它会检查现有的自定义帐户,如果没有找到帐户,则显示登录页面 因此,我创建了我的AccountAuthenticator作为一个库项目,并在两个应用程序中引用它。据此: 假设您将验证器的代码复制到两个应用程序中,因此 共享其逻辑,并更改每个应用程序上的登录页面设计 以适合它所属的应用程序。在这种情况下,第一个安装的应用程序 当验证令牌将被激活时,将为这两个应用调用验证器 请求。如果卸载第一个

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

因此,我创建了我的
AccountAuthenticator
作为一个库项目,并在两个应用程序中引用它。据此:

假设您将验证器的代码复制到两个应用程序中,因此 共享其逻辑,并更改每个应用程序上的登录页面设计 以适合它所属的应用程序。在这种情况下,第一个安装的应用程序 当验证令牌将被激活时,将为这两个应用调用验证器 请求。如果卸载第一个应用程序,则第二个应用程序 从现在起将调用验证器(因为它是唯一的验证器) 现在)

当我运行其中一个应用程序(无论哪个应用程序)并调用
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);
mAccountManager.addAccount(accountType,authTokenType,null,null,this,new AccountManagerCallback()){
@凌驾
公共作废运行(AccountManagerFuture){
试一试{
Bundle bnd=future.getResult();
showMessage(“已创建帐户”);
}捕获(例外e){
e、 printStackTrace();
showMessage(如getMessage());
}
}
},空);

提前感谢

我不确定这是正确的答案,但我发现问题在于应用程序有不同的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用于在两个或多个应用程序之间共享进程(如)

语法

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

. . .

找到这篇写得很好的文章