如何使用AddAccountExplicitly添加帐户?

问题描述:

我发现很多关于这个主题的问题,没有一个答案或外部链接断开。我想以简单的方式添加一个帐户。错误总是相同的:java.lang.SecurityException:调用者uid xxxxx与认证者的uid不同(我调用addAccountExplicitly)。但是,账号类型在代码和xml中是相同的,所以......我在哪里做错了?如何使用AddAccountExplicitly添加帐户?

public class AuthActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_auth); 

     AccountManager accountManager = AccountManager.get(this); 
     final Account account = new Account("username", getString(R.string.account_type)); 
     accountManager.addAccountExplicitly(account, "password", null); 
    } 
} 

<?xml version="1.0" encoding="utf-8"?> 
<account-authenticator 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:accountType="@string/account_type" 
    android:icon="@drawable/ic_launcher" 
    android:smallIcon="@drawable/ic_launcher" 
    android:label="@string/name_app" /> 
+0

只是为了确保您试图添加自己的帐户类型,而不是Google,Facebook或类似帐户? – nibarius 2014-11-21 07:58:36

+2

是的,自然我试图添加我的自定义类型的帐户。 – 2014-11-21 11:09:51

作为例外说你的应用程序和你的验证器必须共享相同的UID。通常,所有不同的应用程序都会得到不同的UID,因此如果您没有专门设置它们以共享UID,它们将具有不同的UID。

您可以通过查看ApplicationInfo.uid来查看您的应用已分配了哪些UID。您可以通过PackageManager中的getApplicationInfo()获取ApplicationInfo。

您可以使用清单文件中的android:sharedUserId属性为您的身份验证器和您的应用程序设置共享UID。

我和你有同样的问题。原来,我没有正确注册我的身份验证服务在我的应用程序清单文件:

<service 
     android:name="com.example.android.syncadapter.AuthenticatorService"> 
    <intent-filter> 
     <action android:name="android.accounts.AccountAuthenticator"/> 
    </intent-filter> 
    <meta-data 
     android:name="android.accounts.AccountAuthenticator" 
     android:resource="@xml/authenticator" /> 
</service> 

你的意图过滤器名称由Android框架定义。因此,它必须是“android.accounts.AccountAuthenticator”