API 30 में सामग्री प्रदाता खोजने में विफल

Aug 24 2020

अद्यतन: मुझे अपना प्रश्न पूरी तरह से बदलना होगा क्योंकि मैंने अपनी समस्या से संबंधित अधिक विवरण पाया है।

समस्या: सामग्री प्रदाता का समाधान करने वाला मेरा ऐप 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

यदि मैं 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>

अगर मैं उसी ऐप में कंटेंट प्रोवाइडर को हल करने की कोशिश करता हूं, तो यह काम करता है।

यदि मैं packageManager.getInstalledPackages(PackageManager.GET_PROVIDERS)अपने क्लाइंट कोड में मौजूदा प्रदाताओं की सूची प्राप्त करने के लिए उपयोग करता हूं तो एपीआई [26,29] के लिए मैं अपने प्रदाता को सूची में देख सकता हूं। अगर मैं एपीआई 30 में इस कोड को चलाता हूं तो मेरा प्रदाता सूची में नहीं है।

ऐसा लगता है कि ContentProvider के पंजीकरण से संबंधित एपीआई 30 में कुछ बदल दिया गया था। हालाँकि मुझे नहीं मिल रहा है क्या।

जवाब

3 StahlRat Sep 28 2020 at 20:13

मेरे कस्टम कंटेंटप्रॉइडर का कारण एपीआई 30 के साथ एमुलेटर पर काम नहीं करना है। यह एंड्रॉइड 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