Gui*_*ino 4 permissions android
我正在开发一些应用程序,其中一个是作为"服务器"(让我们称之为Core),其余的作为客户端.Core应用程序是在后台运行的服务,客户端应用程序使用Core的提供程序来获取数据.
为此,我已将权限添加到我的服务应用中:
<permission android:name="com.mycompany.android.core.DATA_READ" />
<permission android:name="com.mycompany.android.core.DATA_WRITE" />
Run Code Online (Sandbox Code Playgroud)
我的应用程序请求权限:
<!-- 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"/>
Run Code Online (Sandbox Code Playgroud)
如果我在设备中安装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
Run Code Online (Sandbox Code Playgroud)
我的问题是,如何在安装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" />
Run Code Online (Sandbox Code Playgroud)
但我认为问题不在这里,因为如果在其他应用程序之前安装了Core应用程序,它就能正常运行.
提前致谢.
我的问题是,如何在安装Core之后"重新生成"权限而不重新安装应用程序?
自定义权限是为固件构建器设计的.虽然应用程序可以创建自定义权限,但存在安全问题(主要是Android 5.0之前的版本),并且必须先定义权限才能保留它们.
你的选择是:
要求首先安装Core,并且在安装Core后必须重新安装其他应用程序
使用<permission>元素在所有应用中定义自定义权限(尽管这将要求所有这些应用在Android 5.0+上使用相同的签名密钥进行签名)
| 归档时间: |
|
| 查看次数: |
453 次 |
| 最近记录: |