Android M 6.0 - SecurityException 试图删除帐户

标签 android permissions android-6.0-marshmallow android-account android-securityexception

我有一个使用 Android AccountManager(程序包名称:com.mycompany.accounts)的应用程序,可将帐户添加到设备并提供登录屏幕。我有另一个应用程序 (com.mycomp.actualapp),它使用第一个应用程序来添加/删除帐户。

我可以使用 list 中的以下权限在 Pre Marshmallow 设备上成功添加和删除帐户:

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

使用 sdk 22 编译并以 sdk 22 为目标时,应自动授予这些权限。以下代码:

      accountManager.removeAccount(getAccount(), activity, new AccountManagerCallback<Bundle>() {
        @Override
        public void run(AccountManagerFuture<Bundle> accountManagerFuture) {
            try {
                Bundle bundle = accountManagerFuture.getResult();
                boolean success = bundle.getBoolean(AccountManager.KEY_BOOLEAN_RESULT);
                if (success) {
                    Toast.makeText(activity, activity.getString(R.string.successfully_loggedout), Toast.LENGTH_LONG).show();
                    afterLogoutSuccess(activity);

                } else {
                    Toast.makeText(activity.getApplicationContext(), activity.getString(R.string.failed_to_logout), Toast.LENGTH_LONG).show();
                }
                onLogoutListener.onLogoutFinished(success);
                return;
            } catch (OperationCanceledException e) {
                Log.e(TAG,"Operation cancelled exception:", e);
            } catch (IOException e) {
                Log.e(TAG, "IOException:", e);
            } catch (AuthenticatorException e) {
                Log.e(TAG, "AuthenticatorException:", e);
            }
            onLogoutListener.onLogoutFinished(false);

        }
    }, null);

失败并出现以下异常:

 java.lang.SecurityException: uid 10057 cannot remove accounts of type: com.mycompany.accounts
        at android.os.Parcel.readException(Parcel.java:1599)
        at android.os.Parcel.readException(Parcel.java:1552)
        at android.accounts.IAccountManager$Stub$Proxy.removeAccount(IAccountManager.java:897)
        at android.accounts.AccountManager$7.doWork(AccountManager.java:900)
        at android.accounts.AccountManager$AmsTask.start(AccountManager.java:1888)
        at android.accounts.AccountManager.removeAccount(AccountManager.java:897)
        at com.mycomp.actualapp.utils.LoginHelper$4.doInBackground(LoginHelper.java:282)
        at com.mycomp.actualapputils.LoginHelper$4.doInBackground(LoginHelper.java:242)
        at android.os.AsyncTask$2.call(AsyncTask.java:295)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
        at java.lang.Thread.run(Thread.java:818)

奇怪的是,这段代码在 Marshmallow 之前的设备上运行良好,没有任何问题。

旁注,我注意到使用 sdk 22 和目标 22 进行编译:转到“设置 > 应用程序 > 我的应用程序(com.mycomp.actualapp)> 权限”我只看到两个权限,“电话”“存储” .

我注意到使用 sdk 23 和目标 23 进行编译:我看到三个权限,“电话”、“存储”和“联系人”。

我尝试了以下方法:

  • 切换到使用 sdk 23 编译 - 在应用程序设置中授予所有权限,尝试再次删除帐户。仍然失败并出现相同的异常。

  • 使用 22 编译并向 list 添加以下权限。确保授予所有权限。仍然失败并出现相同的异常:

    <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"/>
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>

我能够在没有额外权限授予的情况下获取用户帐户用户名和 token ,但删除帐户不起作用。 如果有任何帮助,我将不胜感激!

最佳答案

我知道回答这个问题已经晚了,但我想我会分享我的发现,以防其他人遇到同样的情况。

我将我的构建升级为使用 23 而不是 22 构建,因为我无法在 22 上解决它。然后我在尝试对它们执行任何操作之前在运行时明确请求权限到 GET_ACCOUNTS。 https://developer.android.com/training/permissions/requesting.html https://developer.android.com/reference/android/Manifest.permission.html#GET_ACCOUNTS

使用 23 进行编译的更多信息:如果应用共享管理帐户的身份验证器的签名,您不需要请求许可。在这种情况下,我的签名不匹配,所以我确实需要请求它。如果您在应用内创建帐户以在应用内使用,则无需在运行时请求权限

关于Android M 6.0 - SecurityException 试图删除帐户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32817053/

相关文章:

android - 无法从 Eclipse 3.7.0 启动 android 模拟器

android - 从推送通知 IntentService 中发布时,Handler 中的 Runnable 不运行

c# - C# 中的读取共享权限

php - docker 卷和 apache 权限

android - 运行时权限: no permission immediately after granting

android - 如何以编程方式为TextInputLayout设置colorControlActivated

android - 如何在构建时让Gradle下载服务器指定版本的依赖项

android - QML Android Image 无法打开内部文件,即使存在

android - Titanium SDK 5.1.2 - Android 6.0 权限

android - 手机锁定时键盘不显示并且 Activity 禁用键盘保护