以错误的顺序安装应用程序时,Android 使用权限问题

标签 android permissions

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

为此,我添加了 permission s 到我的服务应用程序:

<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" />

但我不认为问题出在这里,因为如果在其余应用程序之前安装核心应用程序,它会运行良好。

提前致谢。

最佳答案

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+ 上由相同的签名 key 签名)

关于以错误的顺序安装应用程序时,Android 使用权限问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26525997/

相关文章:

java - Android HttpsUrlConnection 验证 SSL

linux - 测试目录中的所有文件是否具有正确的权限

linux - 通过 ssh (svn+ssh) 对 svn 存储库进行只读访问

android - 自定义 Android 通知磁贴的背景

android - 是否可以使用SIM卡加密功能?

java - 如何为 Android 自定义 View 添加 OnClick 事件

android - 我是否需要在 onDestroy 期间从 View 中释放 View.OnClickListener?

c# - 创建 CNG key 的权限

java - Android 运行时权限(权限被拒绝)

c# - 如果我的程序正在将 dll 文件复制到临时目录,我是否需要特定权限?