2017-09-24 11 views
0

のパスに付与されていない私は私のアプリウリ許可がプロバイダ

<provider android:authorities="com.myapp.android.provider" android:exported="false" android:name="com.myapp.android.provider.FileSystemProvider"> 
    <grant-uri-permission android:pathPrefix="/"/> 
</provider> 

でプロバイダを持っていると私は、次の意思を呼び出すとき:

Intent intent = new Intent(); 
intent.setClassName(getPackageName(), "com.myapp.android.CameraActivity"); 
intent.setData(Uri.parse("content://com.myapp.android.provider/")); 
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION 
     | Intent.FLAG_GRANT_WRITE_URI_PERMISSION 
     | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION 
     | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION); 

を私は例外

取得します

発生原因:java.lang.SecurityException:アクセス許可が拒否されている:開始 インテント{dat = content://com.myapp.android.provider/ flg = 0xc3 cmp = com ......../com .........(補足あり)} からProcessRecord {44955bc0 9477:com ...../u0a260}(pid = 9477, uid = 10260)はuidからエクスポートされていません10230

私は間違っていますか?ファイルや別のディレクトリへのフルパスを指定しようとしましたが、うまく機能しませんでした。

答えて

0
intent.setClassName(getPackageName(), "com.myapp.android.CameraActivity"); 

ほとんどの場合、これはあなたのアプリケーションであるコードの実際の行ではありません。あなたの実際のコードは他のアプリを指定しています。それにかかわらず、このコンポーネントはエクスポートされないため、アプリケーションからアクセスすることはできません。

+0

しかし、なぜですか?私はアクセスを許可しました –

+0

Android docs say: 'コンテンツプロバイダのgrantUriPermissions属性が「true」の場合、プロバイダの権限の下にあるすべてのデータに対して許可を与えることができます。ただし、その属性が "false"の場合、この要素で指定されているデータ・サブセットにのみ許可を与えることができます。プロバイダには、任意の数の要素を含めることができます。それぞれ1つのパスしか指定できません(可能な3つの属性のうちの1つだけ)。 –

+0

@SteveWarner:あなたは 'Uri'へのアクセスを許可しました。そのアクティビティは他の誰かのアプリにあり、そのアクティビティはエクスポートされません。 – CommonsWare

0
<provider android:authorities="com.myapp.android.provider" 
android:exported="true"<----- change android:name="com.myapp.android.provider.FileSystemProvider"> 
     <grant-uri-permission android:pathPrefix="/"/> 
    </provider> 
+0

私は誰にもエクスポートしないでください。特定のパスを付与するだけです –