2015-12-13 3 views
8

にファイルのFileProviderを設定する方法を、私はFileProviderキャッシュディレクトリ内のファイルの場合は外部キャッシュディレクトリ

<cache-path 
    name="image" 
    path="image/"/> 

を設定するには、XMLでこれを追加することができますが、外部キャッシュディレクトリでI・ストレージ・ファイルならば、私はexternal-取得することはできませんキャッシュパスFileProvider.And

<external-path 
    name="image_external" 
    path="cache/image/"/> 

を設定するには、そのようなタグか何かは、あまりにも、助けにはなりませんでした。

これは私のマニフェストファイルです:

<provider 
     android:name="android.support.v4.content.FileProvider" 
     android:authorities="com.tizi.quanzi" 
     android:exported="false" 
     android:grantUriPermissions="true"> 
     <meta-data 
      android:name="android.support.FILE_PROVIDER_PATHS" 
      android:resource="@xml/file_paths"/> 
</provider> 

これは、XML/file_pathsファイルです:

<?xml version="1.0" encoding="utf-8"?> 
<paths> 
    <cache-path 
     name="image" 
     path="image/"/> 
    <external-path 
     name="image_external" 
     path="cache/image/"/> 
</paths> 

そして、これは私のコードです:

String RootPath = App.getApplication().getExternalCacheDir().getAbsolutePath(); 
String filePath = RootPath + "/image/" + fileName; 
// done something there to save file 
Intent shareIntent = new Intent(); 

Uri contentUri = FileProvider.getUriForFile(App.getApplication(), 
     App.getApplication().getPackageName(), new File(filePath)); 
App.getApplication().grantUriPermission(App.getApplication().getPackageName(), 
     contentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
shareIntent.setData(contentUri); 
shareIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
shareIntent.setAction(Intent.ACTION_SEND); 
shareIntent.putExtra(Intent.EXTRA_STREAM, contentUri); 
shareIntent.setType("image/*"); 

activity.startActivity(Intent.createChooser(shareIntent, "share image")); 

そして、これは誤りでありますINFOMATION:

/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.tizi.quanzi, PID: 27487 
java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Android/data/com.tizi.quanzi/cache/image/o9xygODHtdP6HXqsuUZghVCsBKTtY4FJgO1MpnmX.jpg 
    at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:678) 
    at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:377) 
    at com.tizi.quanzi.tool.ShareImage.shareImage(ShareImage.java:67) 
    at com.tizi.quanzi.tool.ShareImage.shareImage(ShareImage.java:61) 
    at com.tizi.quanzi.adapter.GalleryAdapter$2.onClick(GalleryAdapter.java:119) 
    at android.support.v7.app.AlertController$AlertParams$3.onItemClick(AlertController.java:956) 
    at android.widget.AdapterView.performItemClick(AdapterView.java:310) 
    at android.widget.AbsListView.performItemClick(AbsListView.java:1145) 
    at android.widget.AbsListView$PerformClick.run(AbsListView.java:3042) 
    at android.widget.AbsListView$3.run(AbsListView.java:3879) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5417) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

答えて

9

更新
サポートライブラリ24.2.0とし、上記の進むべき道はが彼の答えで述べている方法@ashughesです。

そのバージョン彼らは外部ファイルとキャッシュ・ディレクトリを参照することができるようにFileProvider.javaの実装に二つの新しいタグを追加しました。

private static final String TAG_EXTERNAL_FILES = "external-files-path"; 
private static final String TAG_EXTERNAL_CACHE = "external-cache-path"; 

あなたがそれにもっと掘り下げたい場合は、on this commit変更内容を見てみることができます。

オリジナルの答え:
私は同じ問題を抱えていました。私はクラスFileProvider.javaを見て、あなたが言ったように、外部キャッシュディレクトリのタグはありません、以下の4つだけです。

private static final String TAG_ROOT_PATH = "root-path"; 
private static final String TAG_FILES_PATH = "files-path"; 
private static final String TAG_CACHE_PATH = "cache-path"; 
private static final String TAG_EXTERNAL = "external-path"; 

私はexternal-pathタグを使用しています。このタグは、キャッシュディレクトリではなく外部ディレクトリのルートを指します。したがって、そこから残りのパスをpathのキャッシュディレクトリに指定するか、ドットを使用して外部ディレクトリのルートを指すようにすることができます。ファイルのパスは、それがない/storage/emulated/0/cache/image/で始まる場合、ファイルのパスが/storage/emulated/0/Android/data/com.tizi.quanzi/cache/image/あるので

<external-path 
    name="external_files" 
    path="."/> 

あなたは

<external-path 
    name="image_external" 
    path="cache/image/"/> 

方法を使用していたgetFileForUri、チェックしていました。そしてそれがあなたが例外を得ている理由です。サポートライブラリ24.2のよう

+0

'外部キャッシュPATH'と'外部ファイル・PATH'の欠如は矛盾するように見えるします。https:// developer.android.com/reference/android/support/v4/content/FileProvider.html。これは大変面白いです。 – etherton

+0

'external-cache-path'と' external-files-path'が動作するためには、24.2.0以降のサポートライブラリを使用している必要があります。 – ashughes

+0

この回答は私の日を作りました、ありがとうございました! FileProviderでexternalCacheDirを共有する必要のある他の人向けです。これがソリューションです。 – Yehonatan

4

。0、あなたは使用できます:

<external-cache-path name="name" path="path" /> 

詳細については、FileProvider docsを参照してください。

0

次の設定は、私の作品: は、私は私のコードで

<paths> 
     <external-cache-path name="external_files" path="."/> 
     <external-path name="external_files" path="."/> 
    </paths> 

を使用しています。

と私のプロバイダーこの

<provider 
     android:name="android.support.v4.content.FileProvider" 
     android:authorities="com.bqe.core.provider.CameraFilesProvider" 
     android:exported="false" 
     android:grantUriPermissions="true"> 
     <meta-data 
      android:name="android.support.FILE_PROVIDER_PATHS" 
      android:resource="@xml/camera_files_provider_paths" /> 

私の分のSDK

  minSdkVersion 21 
関連する問題