Android SecurityException: uid xxxxx не может явно добавить учетные записи - PullRequest
0 голосов
/ 09 июля 2019

Я получаю сообщение об ошибке

java.lang.SecurityException: uid 10178 cannot explicitly add accounts of type: net.roughdesign.swms

даже с самым простым примером, который я могу создать.Он состоит из:

Конфигурация учетной записи

тип учетной записи в strings.xml

<string name="accounts__account_type">net.roughdesign.swms</string>

authenticator.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
            android:accountType="@string/accounts__account_type"
            android:icon="@drawable/ic_add_black_24dp"
            android:smallIcon="@drawable/ic_add_black_24dp"
            android:label="@string/global__authenticator_account_label"
            />

</resources>

SwmsAccountAuthenticator.kt

class SwmsAccountAuthenticator(val context: Context) : AbstractAccountAuthenticator(context) {

    override fun addAccount(
        response: AccountAuthenticatorResponse, accountType: String, authTokenType: String?,
        requiredFeatures: Array<out String>?, options: Bundle?
    ): Bundle? {
        return null
    }


    override fun confirmCredentials(response: AccountAuthenticatorResponse, account: Account, options: Bundle?)
            : Bundle? {
        return null
    }


    override fun editProperties(response: AccountAuthenticatorResponse?, accountType: String?): Bundle? {
        return null
    }


    override fun getAuthToken(
        response: AccountAuthenticatorResponse, accountInput: Account, authTokenType: String, options: Bundle?
    ): Bundle? {

        return null
    }


    override fun getAuthTokenLabel(authTokenType: String): String? {
        return null
    }


    override fun hasFeatures(response: AccountAuthenticatorResponse, account: Account, features: Array<out String>)
            : Bundle? {
        return null
    }


    override fun updateCredentials(
        response: AccountAuthenticatorResponse, account: Account, authTokenType: String?, options: Bundle?
    ): Bundle? {
        return null
    }
}

SwmsAuthenticatorService.kt

class SwmsAuthenticatorService : Service() {
    override fun onBind(intent: Intent?): IBinder? {
        val authenticator = SwmsAccountAuthenticator(this)
        return authenticator.iBinder
    }
}

И, наконец, вAndroidManifest.xml

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

<application ... >

    <service
            android:name=".users.SwmsAuthenticatorService"
            android:exported="false">
        <intent-filter>
            <action android:name="android.accounts.AccountAuthenticator" />
        </intent-filter>
        <meta-data
                android:name="android.accounts.AccountAuthenticator"
                android:resource="@xml/authenticator" />
    </service>

   ...
</application>

Пытаюсь использовать его

Я пытаюсь создать учетную запись с этим:

val username = "myUserName"
val password = "myPassword"

val accountManager = AccountManager.get(this)
val accountType = getString(R.string.accounts__account_type)
val account = Account(username, accountType)

val accountAdded = accountManager.addAccountExplicitly(account, password, null)

затем для последней строки (accountManager.addAccountExplicitly), я получаю вышеупомянутую ошибку:

   java.lang.SecurityException: uid 10178 cannot explicitly add accounts of type: net.roughdesign.swms
        at android.os.Parcel.readException(Parcel.java:2013)
        at android.os.Parcel.readException(Parcel.java:1959)
        at android.accounts.IAccountManager$Stub$Proxy.addAccountExplicitly(IAccountManager.java:1205)
        at android.accounts.AccountManager.addAccountExplicitly(AccountManager.java:878)
        at net.roughdesign.swms.swmsandroid.users.AuthenticateActivity.submit(AuthenticateActivity.kt:68)
...

Я понятия не имею, что все еще может быть проблема здесь.Насколько мне известно, тип учетной записи (net.roughdesign.swms) «зарегистрирован» в моем приложении путем добавления части <service> в манифест, но я думаю, что android не принимает, что «это мое».

В чем еще может быть проблема?

1 Ответ

0 голосов
/ 10 июля 2019

Общее решение - как это отладить

В представлении журнала android studio по умолчанию установлен фильтр «Показать только выбранное приложение». Я получил сообщения о том, что службе моей учетной записи не удалось зарегистрироваться, включая причину. Однако при настройке фильтра по умолчанию они не показывались!

Итак, чтобы понять, что на самом деле здесь происходит, переключите настройку фильтра на «Нет фильтров». Это приведет к появлению соответствующего сообщения об ошибке.

Однако, он показывает все сообщений журнала, так что вы получите тонну из них. Мне пришлось немного прокрутить, чтобы увидеть это сообщение об ошибке. Мой совет: после того, как вы получите то, что вам нужно, установите фильтр обратно на «Показать только выбранное приложение».

Мой конкретный вопрос

Проблема была с authenticator.xml. Этот файл не должен иметь элемент <resources>. <account-authenticator> должен быть элементом верхнего уровня; полный файл должен выглядеть так:

<?xml version="1.0" encoding="utf-8"?>
<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
        android:accountType="@string/accounts__account_type"
        android:icon="@drawable/ic_add_black_24dp"
        android:label="@string/global__authenticator_account_label"
        android:smallIcon="@drawable/ic_add_black_24dp" />
...