2015-12-13 6 views
8

, ben Dış Önbelleğindeki dosya için FileProvider nasıl ayarlanacağı dir Önbellek dir dosyası için

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

FileProvider

Ama ayarlamak için xml bu ekleyebilir Dış önbellek Dir I depolama dosyası, ben rici alamayan eğer önbellek-yolu etiketi veya FileProvider.And

'un ayarlanması gibi bir şey de yardımcı olmadı.

Bu benim Manifest dosyasıdır:

<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> 

Bu xml/file_paths dosyasıdır:

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

Ve bu benim Kod geçerli:

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")); 

Ve bu hatadır 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) 

cevap

9

Güncelleme: @ashughes onun cevabını diyor nasıl
yolu yukarıdaki Destek Kitaplığı 24.2.0 ile gitmek ve etmektir.

bu sürümün onlar harici dosya ve önbellek dizinleri referans edebilmek için FileProvider.java uygulanmasına iki yeni etiketler eklendi.
private static final String TAG_EXTERNAL_FILES = "external-files-path"; 
private static final String TAG_EXTERNAL_CACHE = "external-cache-path"; 

bunu içine daha derinlere inmek isterseniz

, sen on this commit yapılan değişikliklere bir göz alabilir.

Orijinal yanıtı:
Aynı problem vardı. FileProvider.java sınıfına bir göz attım ve dediğin gibi, harici önbellek dir için bir etiket yok, sadece aşağıdaki dört.

Yaptığım şey, external-path etiketini kullanmaktır. Bu etiket, harici dizinin köküne önbellek için işaret edecektir. Yani ya yolun geri kalanını path adresindeki önbellek dizinine belirtebilir ya da bir noktayı kullanarak harici dizinin kökünü işaret edebilirsiniz. Dosyanın yolu öyle değil /storage/emulated/0/cache/image/ ile başlıyorsa dosyanızın yolunu /storage/emulated/0/Android/data/com.tizi.quanzi/cache/image/ çünkü

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

Eğer

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

yöntem kullanıyorlardı getFileForUri, kontrol ediyordu . Ve bu istisnayı almanın sebebi de buydu. Destek Kütüphanesi 24.2 itibariyle

+0

dış-cache-path' ve 'dış-files-path' çelişmektedir' eksikliği gibi görünüyor developer.android.com/reference/android/support/v4/content/FileProvider.html. Bu süper sinir bozucu. – etherton

+0

Çalışmak üzere 'harici önbellek yolu' ve 'harici dosya yolu' için destek libslerinin 24.2.0 veya sonraki sürümünü kullanmalısınız. – ashughes

+0

Bu cevap benim günüm oldu, çok teşekkür ederim! ExternalCacheDir'i FileProvider ile paylaşması gereken diğer kişiler için - Bu çözümdür. – Yehonatan

4

.0, kullanabilirsiniz:

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

fazla ayrıntı için FileProvider docs bakınız.

0

ardından yapılandırma benim için çalışıyor: benim kodunda

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

kullanın. https: //

ve benim sağlayıcısı bu

<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" /> 

benim dk sdk

  minSdkVersion 21