Android M 6.0 – SecurityException试图删除帐户

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

我可以使用清单中的以下权限在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)

奇怪的是,这个代码在Pre Marshmallow设备上运行正常,没有任何问题.

在旁注中,我注意到使用sdk 22进行编译并且定位22:转到“设置>应用>我的应用(com.mycomp.actualapp)>权限”我只看到两个权限,“电话”“存储” .

我注意到用sdk 23编译并且目标23:我看到三个权限,“电话”,“存储”和“联系人”.

我尝试过以下方法

>切换到使用sdk 23编译 – 在应用程序设置中授予所有权限,再次尝试删除帐户.仍然失败,同样的例外.
>使用22进行编译并将以下权限添加到清单中.确保授予所有权限.仍然失败,同样的例外:

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

我可以在没有其他权限授予的情况下获取用户帐户用户名和令牌,但删除帐户不起作用.
我真的很感激任何帮助!

解决方法

昨天我突然陷入了同样的困境.
就我而言,我在节点中定义了错误的包名称.
只需修复它就能完美运行.

<帐户认证符>
的xmlns:机器人= “http://schemas.android.com/apk/res/android”
android:accountType =“你的正确数据包名称”“.accounts”
机器人:图标= “@绘制/ ic_launcher”
机器人:标签= “XXX”
机器人:smallIcon = “@绘制/ ic_launcher”
>
< /帐户认证符>

如果您的包裹名称是:com.example.android然后帐户类型应该是:com.example.android.accounts

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...