在窗口小部件RemoteViewsFactory的Android权限拒绝为内容(Android Pe

2019-07-03 12:27发布

我有我试图使用到ListView里面显示来自我的应用程序的本地数据库信息的控件。

我使用的是RemoteViewsService.RemoteViewsFactory界面加载我的名单中的内容。 如果我运行的代码重新加载在onDataSetChanged法列表中的块。 应用程序崩溃并显示以下消息:

11-01 16:40:39.540: E/ACRA(27175): DataDisplay fatal error : Permission Denial: reading com.datadisplay.content.ContentProviderAdapter uri content://com.datadisplay.provider.internalDB/events from pid=573, uid=10029 requires the provider be exported, or grantUriPermission()

然而,在类的构造函数执行与此相同的代码工作就好了。 当然,我需要有这样的onDataSetChanged方法也工作了更新和东西。

这里是我的供应商在清单条目:

    <provider android:name="com.datadisplay.content.ContentProviderAdapter"
        android:authorities="com.datadisplay.provider.internalDB"
        android:exported="true"
        android:enabled="true"
        android:grantUriPermissions="true">
            <grant-uri-permission android:pathPattern="/events/"/>
    </provider>

我既将其导出并授予乌里权限,如错误信息的请求,但它仍然失败。 我发现这个问题,这里的人有一个问题,但最终还是删除了自定义的权限和它的工作。 我没有像任何自定义权限,但仍没有运气:

窗口小部件与内容提供商; 无法使用ReadPermission?

如果任何人有洞察力,我会非常感激,这是越来越令人沮丧,哈哈。

Answer 1:

把这个在您的onDataSetChanged()方法:

    Thread thread = new Thread() {
        public void run() {
            query();
        }
    };
    thread.start();
    try {
        thread.join();
    } catch (InterruptedException e) {
    }

从内部数据库中获取数据query()方法。 我不知道为什么取数据在一个单独的线程可以帮助解决这个问题搞定了,但它的工程! 我从Android的一个例子得到这个。



Answer 2:

这是发生,因为RemoteViewsFactory正在从一个远程过程调用,这种情况下正用于许可执行。 (远程调用者没有使用你的供应商的许可,所以它抛出一个SecurityException。)

为了解决这个问题,你可以清除远程进程的身份,使执法权限是对你的应用,而对远程调用者进行检查。 下面是你在所有的平台上找到一个共同的模式:

final long token = Binder.clearCallingIdentity();
try {
    [perform your query, etc]
} finally {
    Binder.restoreCallingIdentity(token);
}


Answer 3:

如果这只是发生了4.2,而不是休息,你需要设置了android:出口=“真”,因为默认改变: http://developer.android.com/about/versions/android-4.2.html

内容提供商默认情况下,不再出口。 也就是说,对于Android的默认值:exported属性现在是“假”如果其他的应用程序能够访问你的内容提供商是非常重要的,你现在必须明确设置的android:出口=‘真’。



文章来源: Android Permission denial in Widget RemoteViewsFactory for Content