Android app crashes on addAccountExplicitly(account, password, null);
Asked Answered
L

6

45

After a successful basic authentication I want to add an account for later use. When I tried to create this account using the following code:

AccountManager accountManager = AccountManager.get(getBaseContext());
final Account basicAccount = new Account(mEmail, "com.example");
accountManager.addAccountExplicitly(basicAccount, mPassword, null);

When addAccountExplicitly(...) is called the app crashes with the following error:

E/AndroidRuntime: FATAL EXCEPTION: main
E/AndroidRuntime: Process: com.example, PID: 19094
E/AndroidRuntime: java.lang.SecurityException: uid 10107 cannot explicitly add accounts of type: com.example
E/AndroidRuntime:     at android.os.Parcel.readException(Parcel.java:1599)
E/AndroidRuntime:     at android.os.Parcel.readException(Parcel.java:1552)
E/AndroidRuntime:     at android.accounts.IAccountManager$Stub$Proxy.addAccountExplicitly(IAccountManager.java:890)
E/AndroidRuntime:     at android.accounts.AccountManager.addAccountExplicitly(AccountManager.java:712)
E/AndroidRuntime:     at com.example.LoginActivity$UserLoginTask.onPostExecute(LoginActivity.java:244)
E/AndroidRuntime:     at com.example.LoginActivity$UserLoginTask.onPostExecute(LoginActivity.java:209)
E/AndroidRuntime:     at android.os.AsyncTask.finish(AsyncTask.java:651)
E/AndroidRuntime:     at android.os.AsyncTask.-wrap1(AsyncTask.java)
E/AndroidRuntime:     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:148)
E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5417)
E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
W/ActivityManager:   Force finishing activity com.example/.LoginActivity

Question:

  1. I am certain that my AccountType are the same as specified in my authenticator.xml. Why does my code crash?
  2. Is it even possible to use AccountManager and Account with basic authentication? I have not been able to find a good example for this (they all use tokens...)
  3. My idea is to use this account for several applications. Is using a service for authentication (with intents) considered a best practice? Any good tutorials on this?

Thanks, Ove

Langill answered 21/10, 2015 at 22:55 Comment(0)
L
35

1) Reason for crash was because the following snippet was missing in AndroidManifest.xml.

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

2) It is absolutely possible, even though best practice example is still missing.

3) No idea. Yet...

Langill answered 22/10, 2015 at 19:20 Comment(1)
See an updated piece of this code at Android Developer's: developer.android.com/training/id-auth/…Unruffled
S
41

In my case it was happening that I had another app installed on the device with the same account name and type, but with different signing cert that the one I was trying to install.

So it was crashing the app.

Checking the android doc for the method addAccountExplicity, it says:

This method requires the caller to have a signature match with the authenticator that owns the specified account.

That was my problem

Soup answered 30/6, 2016 at 11:37 Comment(1)
How can we know which app is clashing with ours easily or programmatically? This will be helpful in the event this crash only happens on user side where we can't replicate it on our end.Flagging
L
35

1) Reason for crash was because the following snippet was missing in AndroidManifest.xml.

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

2) It is absolutely possible, even though best practice example is still missing.

3) No idea. Yet...

Langill answered 22/10, 2015 at 19:20 Comment(1)
See an updated piece of this code at Android Developer's: developer.android.com/training/id-auth/…Unruffled
B
21

You are using "com.example" as unique identifier for your app,please check if it's same in "authenticator.xml"

Blancheblanchette answered 11/6, 2016 at 22:54 Comment(2)
Adding to sultan answer please check if android:accountType="pkgname" and Account account = new Account(context.getString(R.string.app_name), context.getPackageName()); accountManager.addAccountExplicitly(account, "123456", bundle); Logger.debug(TAG, "Account created successfully"); are sameInhabited
can you help me : #60792342Trash
S
12

It may cause by an ACCOUNT_TYPE mismatch. check ACCOUNT_TYPE in Class and ACCOUNT_TYPE in authenticator.xml must match

private static final String ACCOUNT_TYPE = "com.someonew.syncaccount";

authenticator.xml

 <?xml version="1.0" encoding="utf-8"?>
    <account-authenticator
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:accountType="com.someonew.syncaccount"
        android:icon="@mipmap/ic_launcher_round"
        android:smallIcon="@mipmap/ic_launcher_round"
        android:accountPreferences="@xml/syncsettings"
        android:label="@string/app_name"/>
Selenaselenate answered 29/6, 2018 at 7:17 Comment(0)
D
1

There's not a one golden response to your 3rd question.

If all apps use the same name, you may consider a service, just remember to restrict it to your own apps.

However, the user may get confused about being signed in just after the app is installed thus I would recommend to allow user to sign in in each separate app. You could generate multiple separate private keys for the the same app in Google Developer Console and thus get the same user LOCAL_ID in every app.

Daemon answered 30/3, 2016 at 14:12 Comment(0)
H
0

In my case i was having Package name contains capital characters, so service was not getting registered in Android Manifest and hence issue was occurred.

android:name="com.SyncServices.SyncService" 

changed to

android:name="com.syncservices.SyncService"
Hortatory answered 3/3, 2020 at 13:22 Comment(1)
Hi, was the issue because a) your sync service was in the package with lower case names, and the Manifest incorrectly used capitals, or b) the sync service was in a package with capital letters, but this was for some reason invalid, and you had to change it and the manifest to use all lower case?Talmudist

© 2022 - 2024 — McMap. All rights reserved.