Failed to find provider info for com.example.databasetest.provider,Unknown URL content:...などの問題の簡単な解決方法


問題の説明
  • カスタムコンテンツプロバイダProviderを学習中に、Providerのappを定義したデータベースにアクセスできない場合があります.Logcatを観察して以下のいくつかのエラーを報告した.

  • 主なエラー
  • java.lang.IllegalArgumentException: Unknown URL content:…
  • Failed to find provider info for com.example.databasetest.provider
  • permission denied

  • 原因を探る
  • で検討したところ、テスト用のシミュレータのSDKがAPI 30であることが判明した.このバージョン(Android 11)の更新では、現在本機に適用されている他のアプリケーションとのインタラクションの仕方が変更されたため、いくつかのチュートリアルのルーチンに従って学習すると、以上のアクセス権の問題が発生する.

  • ソリューション
  • 第1の態様:他のアプリケーションにアクセスする必要があるProviderのアプリケーションのManifestに、アクセスする他のアプリケーションリソースを宣言する要素を追加する.
  • 例として、ここで私のprovidertestアプリケーションはdatabasetest内で定義されたProviderにアクセスする必要があります.では、私は
  • と書きます.
    
    <manifest 
              xmlns:android="http://schemas.android.com/apk/res/android"
              package="com.example.providertest">
    
    
    
    
        <queries>
            <package android:name="com.example.databasetest" />
            
            
    
        queries>
    
    
        <application>
            ...
        application>
    
    manifest>
    
  • 第2のシナリオ:第1のシナリオが有効でない場合は、Providerを定義するアプリケーションManifestでアクセス可能権限を宣言し、Providerのアプリケーションにアクセスする必要があるManifestで権限を取得します.
  • Providerのアプリケーションを定義するManifest
  • です.
    
    <manifest 
              xmlns:android="http://schemas.android.com/apk/res/android"
              package="com.example.databasetest">
    
       <permission
           android:name="DatabaseProvider._READ_PERMISSION"
           android:protectionLevel="normal" />
    
       <permission
           android:name="DatabaseProvider._WRITE_PERMISSION"
           android:protectionLevel="normal" />
    
        <application ...>
            ...
            <provider
                    android:name=".DatabaseProvider"
                    android:authorities="com.example.databasetest.provider"
                    android:enabled="true"
                    android:exported="true">
            provider>
            ...
        application>
    
    manifest>
    
  • Providerのアプリケーションにアクセスする必要があるManifest
  • です.
    
    <manifest 
              xmlns:android="http://schemas.android.com/apk/res/android"
              package="com.example.providertest">
    
       <uses-permission android:name="DatabaseProvider._READ_PERMISSION" />
       <uses-permission android:name="DatabaseProvider._WRITE_PERMISSION" />
    
        <queries>
            <package android:name="com.example.databasetest" />
            
            
    
        queries>
    
    
        <application>
            ...
        application>
    
    manifest>
    
  • マニフェストを変更した後、2つのアプリケーションを再インストールすればよい.

  • リファレンスドキュメント
  • Package visibility in Android 11
  • Managing package visibility