ไม่พบ Content Provider ใน API 30

Aug 24 2020

UPDATE:ฉันต้องเปลี่ยนคำถามทั้งหมดเนื่องจากพบรายละเอียดเพิ่มเติมที่เกี่ยวข้องกับปัญหาของฉัน

ปัญหา: แอปของฉันที่แก้ไข Content Provider ไม่ทำงานใน Emulator กับ API 30 ข้อผิดพลาด:

java.lang.SecurityException: Failed to find provider com.a52.datafeeder01.MyProvider for user 0; expected to find a valid ContentProvider for this authority

ถ้าผมใช้ API 26,27,28 และ 29 แล้วมีปัญหาไม่

AndroidManifest.xml ในแอปที่มี ContentProvider:

<manifest>
    <permission
        android:name="MyProvider._READ_PERMISSION"
        android:protectionLevel="normal" />
    <application>
        <activity>
        ...
        </activity>
        <provider android:name=".MyProvider"
            android:authorities="com.a52.datafeeder01.MyProvider"
            android:enabled="true"
            android:exported="true"
            android:readPermission="MyProvider._READ_PERMISSION"/>
    </application>
</manifest>

AndroidManifest.xml ในแอปไคลเอนต์:

<manifest>
...
    <uses-permission android:name="MyProvider._READ_PERMISSION" />
...
</manifest>

หากฉันพยายามแก้ไข Content Provider ในแอพเดียวกันก็ใช้ได้

หากฉันใช้packageManager.getInstalledPackages(PackageManager.GET_PROVIDERS)รหัสไคลเอ็นต์ของฉันเพื่อรับรายชื่อผู้ให้บริการที่มีอยู่แล้วสำหรับ API [26,29] ฉันสามารถเห็นผู้ให้บริการของฉันในรายการ หากฉันเรียกใช้รหัสนี้ใน API 30 ผู้ให้บริการของฉันไม่อยู่ในรายการ

ดูเหมือนว่ามีการเปลี่ยนแปลงบางอย่างใน API 30 ที่เกี่ยวข้องกับการลงทะเบียน ContentProvider อย่างไรก็ตามฉันไม่พบสิ่งที่

คำตอบ

3 StahlRat Sep 28 2020 at 20:13

เหตุผลที่ ContentProvider ที่กำหนดเองของฉันไม่ทำงานบน Emulator กับ API 30 คือการเปิดเผยแพ็คเกจใน Android 11+

เพื่อแก้ไขปัญหาของฉันฉันได้เพิ่ม<queries>องค์ประกอบต่อไปนี้ใน AndroidManifest.xml ของไคลเอนต์:

<manifest>
...
    <queries>
        <package android:name="com.a52.datafeeder01" />
    </queries>
...
</manifest>

ที่com.a52.datafeeder01เป็นชื่อแพคเกจที่กำหนดเอง ContentProvider ถูกกำหนด

Isato Dec 02 2020 at 16:44

ในกรณีที่ฉันมีปัญหาเพียงเพิ่ม:

<manifest>
...
    <queries>
        <provider android:authorities="com.example.appcontainprovider" />
    </queries>
...
</manifest>

โดยที่authoritiesมูลค่าคือผู้ให้บริการ

อ้างอิง: https://developer.android.com/training/basics/intents/package-visibility#provider-authority