ไม่พบ Content Provider ใน API 30
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 อย่างไรก็ตามฉันไม่พบสิ่งที่
คำตอบ
เหตุผลที่ ContentProvider ที่กำหนดเองของฉันไม่ทำงานบน Emulator กับ API 30 คือการเปิดเผยแพ็คเกจใน Android 11+
เพื่อแก้ไขปัญหาของฉันฉันได้เพิ่ม<queries>องค์ประกอบต่อไปนี้ใน AndroidManifest.xml ของไคลเอนต์:
<manifest>
...
<queries>
<package android:name="com.a52.datafeeder01" />
</queries>
...
</manifest>
ที่com.a52.datafeeder01เป็นชื่อแพคเกจที่กำหนดเอง ContentProvider ถูกกำหนด
ในกรณีที่ฉันมีปัญหาเพียงเพิ่ม:
<manifest>
...
<queries>
<provider android:authorities="com.example.appcontainprovider" />
</queries>
...
</manifest>
โดยที่authoritiesมูลค่าคือผู้ให้บริการ
อ้างอิง: https://developer.android.com/training/basics/intents/package-visibility#provider-authority