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.
Beitrag ganze Manifest –
„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
Ok, ich habe das ganze Manifest gepostet. Vielen Dank @CommonsWare –