2016-04-25 19 views
0

Hinweis: Dies ist kein Duplikat, ich habe viele Lösungen in ähnlichen StackOverflow-Fragen ausprobiert und sie haben in meinem Fall nicht funktioniert. Danke für jede Hilfe.java.lang.SecurityException: Anrufer-UID XXXXX fehlt an android.permission.GET_ACCOUNTS

Dieser Absturz scheint nur auf Geräten mit einer Android-Version älter als 6.0 auftreten. Zum Beispiel stürzt es auf einem XT1032 ab, auf dem Android Version 5.1 läuft. In diesem Fall, wenn ich diese Methode aufrufen, in meiner AppCompatActivity der onCreate Methode,

AccountManager.get(this).addOnAccountsUpdatedListener(this, null, true);

Es stürzt ab, weil sie nicht über die erforderliche Berechtigung zu haben scheint (und ich weiß nicht, warum, weil sie in der ist Manifest). Ich glaube, es ist wirklich nicht das Verfahren ein, sondern stürzt auf das Verfahren aufgrund der @RequiresPermission Zeile eingeben:

@RequiresPermission(GET_ACCOUNTS) 
    public void addOnAccountsUpdatedListener(final OnAccountsUpdateListener listener, 
      Handler handler, boolean updateImmediately) { ... 

Hier ist der Stack-Trace, plus einige mehr Logging-Code:

V/AccountManagerService: getAccounts: accountType null, caller's uid 10018, pid 23074 
V/AccountManagerService: caller uid 10018 has android.permission.GET_ACCOUNTS 
V/AccountManagerService: getAccounts: accountType null, caller's uid 10018, pid 23074 
V/AccountManagerService: caller uid 10018 has android.permission.GET_ACCOUNTS 
V/AccountManagerService: caller uid 10009 has android.permission.INTERACT_ACROSS_USERS 
V/AccountManagerService: getAccounts: accountType com.google, caller's uid 10009, pid 1738 
V/AccountManagerService: caller uid 10009 has android.permission.GET_ACCOUNTS 
V/AccountManagerService: getAccounts: accountType null, caller's uid 10018, pid 23074 
V/AccountManagerService: caller uid 10018 has android.permission.GET_ACCOUNTS 
V/AccountManagerService: getAccounts: accountType null, caller's uid 10156, pid 13722 
W/AccountManagerService: caller uid 10156 lacks any of android.permission.GET_ACCOUNTS 

java.lang.RuntimeException: Unable to start activity ComponentInfo{MainActivity}: java.lang.SecurityException: caller uid 10156 lacks any of android.permission.GET_ACCOUNTS 
                          at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) 
                          at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
                          at android.app.ActivityThread.access$800(ActivityThread.java:151) 
                          at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
                          at android.os.Handler.dispatchMessage(Handler.java:102) 
                          at android.os.Looper.loop(Looper.java:135) 
                          at android.app.ActivityThread.main(ActivityThread.java:5254) 
                          at java.lang.reflect.Method.invoke(Native Method) 
                          at java.lang.reflect.Method.invoke(Method.java:372) 
                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
                          Caused by: java.lang.SecurityException: caller uid 10156 lacks any of android.permission.GET_ACCOUNTS 
                          at android.os.Parcel.readException(Parcel.java:1546) 
                          at android.os.Parcel.readException(Parcel.java:1499) 
                          at android.accounts.IAccountManager$Stub$Proxy.getAccounts(IAccountManager.java:728) 
                          at android.accounts.AccountManager.getAccounts(AccountManager.java:407) 
                          at android.accounts.AccountManager.addOnAccountsUpdatedListener(AccountManager.java:2372) 

Was sind die Anrufer-UIDs und warum benutzt sie die UID 10156 anstelle von 10018 oder 10009, die die Erlaubnis haben?

Ich habe überprüft, dass meine Kontotyp Zeichenfolge in meinem AuthenticationService die gleiche wie die accountType der authenticator.xml ist, und beide verwenden fest codierte Zeichenfolgen (keine String-Ressourcen).

public class AuthenticationService extends Service { 

    public static final String ACCOUNT_TYPE = "com.mywebsite"; 
    ... 
    public static boolean createAccount(String username,...) { 

     AccountManager am = AccountManager.get(Application.getInstance()); 
     Account account = new Account(username, ACCOUNT_TYPE); 

Und mein Authentifikator:

<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android" 
         android:accountType="com.mywebsite" 
         android:icon="@mipmap/ic_launcher" 
         android:smallIcon="@mipmap/ic_launcher" 
         android:label="@string/app_name" 
    /> 

Ich habe auch dies: <uses-permission android:name="android.permission.GET_ACCOUNTS" /> im <manifest> Tag, nicht der <application>-Tag. Manifest:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.mywebsite.android.department.departmentname” > 

    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
    <uses-permission android:name="android.permission.USE_CREDENTIALS" /> 
    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" /> 
    <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" /> 
    <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" /> 
    <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" /> 
    <uses-permission android:name="android.permission.READ_CALENDAR" /> 
    <uses-permission android:name="android.permission.WRITE_CALENDAR" /> 
    <uses-permission android:name="android.permission.WAKE_LOCK"/> 
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/> 
    <uses-permission android:name="android.permission.READ_LOGS"/> 

    <application 
     android:name=".Application" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name”> 
     <service android:name=".auth.AuthenticationService" > 
      <intent-filter> 
       <action android:name="android.accounts.AccountAuthenticator" /> 
      </intent-filter> 

      <meta-data 
       android:name="android.accounts.AccountAuthenticator" 
       android:resource="@xml/authenticator" /> 
     </service> 

    </application> 

</manifest> 

Dies scheint ein Hinweis in der Android-Dokumentation zu sein, aber es scheint nicht mit meinem Fehler zu korrelieren, weil ich die Erlaubnis, im Manifest kann als (http://developer.android.com/reference/android/Manifest.permission.html#GET_ACCOUNTS):

Hinweis: Beginnend mit Android 6.0 (API-Stufe 23), wenn eine App die Signatur des Authentifikators, der ein Konto verwaltet, teilt, benötigt es nicht die Berechtigung "GET_ACCOUNTS" Informationen über dieses Konto zu lesen. Unter Android 5.1 und niedriger benötigen alle Apps die Berechtigung "GET_ACCOUNTS" , um Informationen zu jedem Konto zu lesen.

+3

Beitrag ganze Manifest –

+2

„Was der Anrufer uids werden“ - sie die Benutzer-IDs Linux sind (uids) der Anwendungen eine Methode aufrufen, die Routen zu 'AccountManagerService'. "Und warum benutzt es die UID 10156 anstelle von 10018 oder 10009, die die Erlaubnis haben?" - Vermutlich hat deine App 10156. Wahrscheinlich sind die anderen Uids für andere Apps auf dem Gerät. – CommonsWare

+0

Ok, ich habe das ganze Manifest gepostet. Vielen Dank @CommonsWare –

Antwort

4

Es stellt sich heraus, dass es einen Konflikt mit einer Bibliothek gab, die ich verwendete. Insbesondere erklärte die Bibliothek des Support-Team mir:

Die Schicht SDK fordert die GET_ACCOUNTS die Erlaubnis, eine maxSdkVersion von 18 verwendet würde es die erscheinen, wenn die Manifeste erhalten fusionierte dies die Erlaubnisanfrage in Ihrem Manifest überschrieben wird, also nicht um Erlaubnis für 19+.

Die Lösung wurde auf mein Manifest von diesem zu ändern:

<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 

dazu:

<uses-permission android:name="android.permission.GET_ACCOUNTS" tools:node="replace" /> 

Insbesondere tools:node="replace" Zugabe.

Für weitere Informationen wenden Sie sich bitte diese Antwort auf meine andere Frage sehen: https://stackoverflow.com/a/37013603/2423194