打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
以错误的顺序安装应用时Android会出现权限问题

我正在开发一些应用程序,其中一个是作为“服务器”(让我们称之为Core),其余的作为客户端. Core应用程序是在后台运行的服务,客户端应用程序使用Core的提供程序来获取数据.

为此,我已将permission添加到我的服务应用中:

<permission android:name="com.mycompany.android.core.DATA_READ" /><permission android:name="com.mycompany.android.core.DATA_WRITE" />

我的应用程序请求权限:

    <!-- Permission to use Core's ContentProvider --><uses-permission android:name="com.mycompany.android.core.DATA_READ"/><uses-permission android:name="com.mycompany.android.core.DATA_WRITE"/>

如果我在设备中安装Core,然后安装任何应用程序,它运行良好,识别权限然后正常执行.

但是应用程序还可以检查设备中是否安装了此Core应用程序,然后从Google Play下载,问题是,当我在应用程序之后安装Core时,我的权限无法识别:

   W/ActivityManager(  751): Permission Denial: opening provider com.mycompany.android.core.db.DataProvider from ProcessRecord{23ee9d17 19907:com.mycompany.android.vanilla.ta/u0a120} (pid=19907, uid=10120) requires com.mycompany.android.core.DATA_READ or com.mycompany.android.core.DATA_WRITE    E/AndroidRuntime(19907): FATAL EXCEPTION: AsyncTask #2    E/AndroidRuntime(19907): Process: com.mycompany.android.vanilla.ta, PID: 19907    E/AndroidRuntime(19907): java.lang.RuntimeException: An error occured while executing doInBackground()    E/AndroidRuntime(19907):    at android.os.AsyncTask$3.done(AsyncTask.java:300)    E/AndroidRuntime(19907):    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)    E/AndroidRuntime(19907):    at java.util.concurrent.FutureTask.setException(FutureTask.java:222)    E/AndroidRuntime(19907):    at java.util.concurrent.FutureTask.run(FutureTask.java:242)    E/AndroidRuntime(19907):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)    E/AndroidRuntime(19907):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)    E/AndroidRuntime(19907):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)    E/AndroidRuntime(19907):    at java.lang.Thread.run(Thread.java:818)    E/AndroidRuntime(19907): Caused by: java.lang.SecurityException: Permission Denial: opening provider com.mycompany.android.core.db.DataProvider from ProcessRecord{23ee9d17 19907:com.mycompany.android.vanilla.ta/u0a120} (pid=19907, uid=10120) requires com.mycompany.android.core.DATA_READ or com.mycompany.android.core.DATA_WRITE    E/AndroidRuntime(19907):    at android.os.Parcel.readException(Parcel.java:1540)    E/AndroidRuntime(19907):    at android.os.Parcel.readException(Parcel.java:1493)    E/AndroidRuntime(19907):    at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:3265)    E/AndroidRuntime(19907):    at android.app.ActivityThread.acquireProvider(ActivityThread.java:4589)    E/AndroidRuntime(19907):    at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2439)    E/AndroidRuntime(19907):    at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1442)    E/AndroidRuntime(19907):    at android.content.ContentResolver.query(ContentResolver.java:462)    E/AndroidRuntime(19907):    at android.content.ContentResolver.query(ContentResolver.java:422)    E/AndroidRuntime(19907):    at com.mycompany.android.app.data.ZKDataQueryResolver.executeQuery(ZKDataQueryResolver.java:123)    E/AndroidRuntime(19907):    at com.mycompany.android.app.data.ZKDataQueryResolver.executeQuery(ZKDataQueryResolver.java:204)    E/AndroidRuntime(19907):    at com.mycompany.android.vanilla.ta.BackgroundService.attemptLogin(BackgroundService.java:161)    E/AndroidRuntime(19907):    at com.mycompany.android.vanilla.ta.LoginActivity$4.load(LoginActivity.java:180)    E/AndroidRuntime(19907):    at com.mycompany.android.vanilla.ta.background.LoaderAsyncTask.doInBackground(LoaderAsyncTask.java:20)    E/AndroidRuntime(19907):    at com.mycompany.android.vanilla.ta.background.LoaderAsyncTask.doInBackground(LoaderAsyncTask.java:8)    E/AndroidRuntime(19907):    at android.os.AsyncTask$2.call(AsyncTask.java:288)    E/AndroidRuntime(19907):    at java.util.concurrent.FutureTask.run(FutureTask.java:237)    E/AndroidRuntime(19907):    ... 4 more    W/ActivityManager(  751):   Force finishing activity com.mycompany.android.vanilla.ta/.LoginActivity

我的问题是,如何在安装Core之后“重新生成”权限而不重新安装应用程序?

编辑:
我的提供者声明是这样的:

   <!-- Here goes the DataProvider definition -->    <provider        android:name="com.mycompany.android.core.db.DataProvider"        android:authorities="com.mycompany.android.core.db.DataProvider"        android:enabled="true"        android:exported="true"        android:readPermission="com.mycompany.android.core.DATA_READ"        android:writePermission="com.mycompany.android.core.DATA_WRITE" />

但我不认为这个问题在这里,因为如果在其他应用程序之前安装了Core应用程序,它就可以正常运行.

提前致谢.

解决方法:

My question is, how to “regenerate” the permissions after Core is installed without reinstalling the application?

自定义权限是为固件构建器设计的.虽然应用程序可以创建自定义权限,但有security issues(主要是pre-Android 5.0),并且必须先定义权限才能保留它们.

你的选择是:

>要求首先安装Core,并且在安装Core后必须重新安装其他应用程序
>使用< permission>定义所有应用中的自定义权限元素(虽然这将要求所有这些应用程序在Android 5.0上使用相同的签名密钥进行签名)

来源:http://www.icode9.com/content-4-234651.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
android开发中出现的错误集(不断更新)
AsyncTask的坑,Handler,Looper与MessageQueue
android调试出现E/AndroidRuntime(13678): java.lang.NoClassDefFoundError:
教你写Http框架(二)——三个例子带你深入理解AsyncTask
java.net.SocketTimeoutException
Android Framework 分析
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服