gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 19:08:58 26 4
gpt4 key购买 nike

我有一个小部件,我试图用它在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com