我按照此说明添加了我的同步适配器.
但是有一个小问题:-(
当我打开设置 - >帐户 - >添加帐户并选择我的帐户时,我收到此错误消息
java.lang.IllegalArgumentException: addAccount not supported at android.accounts.AccountManager.convertErrorToException(AccountManager.java:2147) at android.accounts.AccountManager.-wrap0(AccountManager.java) at android.accounts.AccountManager$AmsTask$Response.onError(AccountManager.java:1993) at android.accounts.IAccountManagerResponse$Stub.onTransact(IAccountManagerResponse.java:69) at android.os.Binder.execTransact(Binder.java:453)
看起来这次崩溃来自将Authenticator Java类转换为Kotlin类.
Java类就像这样锁定
public class Authenticator extends AbstractAccountAuthenticator { private final Context mContext; // Simple constructor public Authenticator(Context context) { super(context); mContext = context; } // Editing properties is not supported @Override public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) { throw new UnsupportedOperationException(); } @Override public Bundle addAccount(AccountAuthenticatorResponse response, String accountType, String authTokenType, String[] requiredFeatures, Bundle options) throws NetworkErrorException { SyncUtilsKt.createSyncAccount(mContext); final Bundle bundle = new Bundle(); bundle.putString(AccountManager.KEY_ACCOUNT_NAME, ConstantsKt.SYNC_ACCOUNT); bundle.putString(AccountManager.KEY_ACCOUNT_TYPE, BuildConfig.ACCOUNT_TYPE); return bundle; } // Ignore attempts to confirm credentials @Override public Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account, Bundle options) throws NetworkErrorException { return null; } // Getting an authentication token is not supported @Override public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException { throw new UnsupportedOperationException(); } // Getting a label for the auth token is not supported @Override public String getAuthTokenLabel(String authTokenType) { throw new UnsupportedOperationException(); } // Updating user credentials is not supported @Override public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException { throw new UnsupportedOperationException(); } // Checking features for the account is not supported @Override public Bundle hasFeatures(AccountAuthenticatorResponse response, Account account, String[] features) throws NetworkErrorException { throw new UnsupportedOperationException(); } }
将它转换为Kotlin后,锁定如下:
class Authenticator(private val mContext: Context) : AbstractAccountAuthenticator(mContext) { // Editing properties is not supported override fun editProperties(response: AccountAuthenticatorResponse, accountType: String): Bundle { throw UnsupportedOperationException() } @Throws(NetworkErrorException::class) override fun addAccount(response: AccountAuthenticatorResponse, accountType: String, authTokenType: String, requiredFeatures: Array, options: Bundle): Bundle { createSyncAccount(mContext) val bundle = Bundle() bundle.putString(AccountManager.KEY_ACCOUNT_NAME, SYNC_ACCOUNT) bundle.putString(AccountManager.KEY_ACCOUNT_TYPE, BuildConfig.ACCOUNT_TYPE) return bundle } // Ignore attempts to confirm credentials @Throws(NetworkErrorException::class) override fun confirmCredentials(response: AccountAuthenticatorResponse, account: Account, options: Bundle): Bundle? { return null } // Getting an authentication token is not supported @Throws(NetworkErrorException::class) override fun getAuthToken(response: AccountAuthenticatorResponse, account: Account, authTokenType: String, options: Bundle): Bundle { throw UnsupportedOperationException() } // Getting a label for the auth token is not supported override fun getAuthTokenLabel(authTokenType: String): String { throw UnsupportedOperationException() } // Updating user credentials is not supported @Throws(NetworkErrorException::class) override fun updateCredentials(response: AccountAuthenticatorResponse, account: Account, authTokenType: String, options: Bundle): Bundle { throw UnsupportedOperationException() } // Checking features for the account is not supported @Throws(NetworkErrorException::class) override fun hasFeatures(response: AccountAuthenticatorResponse, account: Account, features: Array ): Bundle { throw UnsupportedOperationException() } }
我觉得转换了什么错了但是什么?
我发现了自己的错误.该addAccount
方法需要一些注释.最后它看起来像这样:
@Throws(NetworkErrorException::class) override fun addAccount(response: AccountAuthenticatorResponse, accountType: String, authTokenType: String?, requiredFeatures: Array?, options: Bundle?): Bundle? { val accountManager = mContext.getSystemService(Context.ACCOUNT_SERVICE) as AccountManager val accounts = accountManager.getAccountsByType("example.com") if (accounts.size == 0) { val newAccount = Account("Sync Account", "example.com") accountManager.addAccountExplicitly(newAccount, null, null) } val bundle = Bundle() bundle.putString(AccountManager.KEY_ACCOUNT_NAME, "Sync Account") bundle.putString(AccountManager.KEY_ACCOUNT_TYPE, "example.com") return bundle }