Oreo

时间:2017-12-28 20:18:42

标签: java android securityexception android-8.0-oreo

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

在同步方面,我的应用程序是Google 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”?

1 个答案:

答案 0 :(得分:0)

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

将其与Google自己的软件中的经典BUG配对,这是一个开源的Google IO Schedule应用程序。

DataBootstrapService第93行中,他们会这样做:

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

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

如果您测试此创建的Uri并致电getAuthority,您会看到该死的null

修复:使用类似BASE_CONTENT_URI的内容,只有“content://”+ AUTHORITY。然后它被修复了。

希望这有助于其他人。