在Oreo中我自己的URI上的ContentProvider.notifyChange的安全例外

问题描述 投票:1回答:1

以前曾经问过这个 - 但从未回答过。所以我再试一次运气。

我的应用程序是同步方面谷歌IO计划应用程序的完美克隆 - 我在this位置使用他们的代码。

在针对SDK 25运行时,一切都在这里工作 - 当我转到26时,它会因此异常而崩溃:

12-28 21:11:13.641 6153-6190/? E/AndroidRuntime: FATAL EXCEPTION: IntentService[DataBootstrapService]
                                                 Process: de.XXX.XXX.debug, PID: 6153
                                                 java.lang.SecurityException: Failed to find provider null for user 0; expected to find a valid ContentProvider for this authority

正如其他资源中所建议的那样:是的,我已经在我的内容提供商上设置了权限。这个错误很荒谬。我不知道它为什么会出现null和用户0。

有没有人知道要寻找什么?谢谢!

您要求提供更多详细信息,但我确实像Google在IO计划中那样做了。

我的AndroidManifest包括我的提供商,如下所示:

<provider
        android:name=".provider.PendelbusProvider"
        android:authorities="${applicationId}.provider"
        android:exported="false"
        android:syncable="true"/>

导致崩溃的行是这样的:

getContentResolver().notifyChange(Uri.parse(PendelbusContract.CONTENT_AUTHORITY), null, false);

我的CONTENT_AUTHORITY定义如下:(间接通过构建变量)

public static final String CONTENT_AUTHORITY = BuildConfig.AUTHORITY;
 // equals to: "de.zordid.pendelbus.debug.provider"

我根本不明白这个消息应该表明什么。

什么是“提供者null”,什么是“用户0”?

java android securityexception android-8.0-oreo
1个回答
0
投票

我的问题的答案在于URI的定义以及使用Uri.getAuthority()从中获得的权限。

将其与Google自己的软件中的经典BUG配对,即谷歌IO计划应用程序,它是开源的。

在他们的DataBootstrapService第93行,他们这样做:

getContentResolver().notifyChange(Uri.parse(ScheduleContract.CONTENT_AUTHORITY), null, false);

但是,我不知道的事:ScheduleContract.CONTENT_AUTHORITY是一个只包含权限的字符串。它不会生成有效的URI,所以这从一开始就是错误的并导致我的问题。

如果你测试这个创建的Uri并调用getAuthority,你会看到该死的null

修复:使用类似BASE_CONTENT_URI的东西,它只是“content://”+ AUTHORITY。然后它是固定的。

希望这有助于其他人。

© www.soinside.com 2019 - 2024. All rights reserved.