内容的 Widget RemoteViewsFactory 中的 Android 权限拒绝

标签 android android-widget android-contentprovider android-permissions

我有一个小部件,我试图用它在 ListView 中显示来 self 的应用程序本地数据库的信息。

我正在使用 RemoteViewsService.RemoteViewsFactory 接口(interface)加载我的列表内容。如果我运行在 onDataSetChanged 方法中重新加载列表的代码块。应用程序崩溃并显示以下消息:

11-01 16:40:39.540: E/ACRA(27175): DataDisplay fatal error :权限被拒绝:读取 com.datadisplay.content.ContentProviderAdapter uri content://com.datadisplay.provider.internalDB/来自 pid=573、uid=10029 的事件需要导出提供者,或者 grantUriPermission()

但是,在类的构造函数中运行的相同代码工作得很好。当然,我还需要在 onDataSetChanged 方法中使用它来进行更新和填充。

这是我的提供商在 list 中的条目:

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

我正在导出它并像错误消息请求一样授予 Uri 权限,但它仍然失败。我发现了这个问题,这个人遇到了问题但最终删除了他的自定义权限并且它起作用了。我没有那样的任何自定义权限,但仍然没有运气:

Widget with content provider; impossible to use ReadPermission?

如果有人有见识,我将不胜感激,这让人非常沮丧,哈哈。

最佳答案

发生这种情况是因为 RemoteViewsFactory 是从远程进程调用的,并且该上下文正用于权限实现。 (远程调用者无权使用您的提供者,因此它会抛出 SecurityException。)

要解决此问题,您可以清除远程进程的标识,以便针对您的应用而不是远程调用者检查权限实现。以下是您会在整个平台上找到的一个常见模式:

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

关于内容的 Widget RemoteViewsFactory 中的 Android 权限拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13187284/

相关文章:

Android 主屏幕小部件(图标、标签 - 样式)

Android CalendarContract,删除重复事件会导致所有事件在日历上消失?

Android BroadcastReceiver 适用于 MOTODEV 模拟器,但不适用于实际的 Motorola i1 设备

android - 更新谷歌地图中的标记

java - Firebase 身份验证中的登录 Activity 不是从新 Activity 启动的

android - 将小部件添加到我自己的应用程序中。- Android

Android SDK 源代码

android - 如何在android中创建水平菜单?

android - 为什么/我们应该在 Android 中使用 Content Provider 时实现 BaseColumns?

android - 是否可以使用 robolectric 将 MediaStore 替换为测试替身?