wie setzen FileProvider für die Datei im Externen Cache-dir
Für die Datei im Cache dir , ich kann hinzufügen, diese in xml, um FileProvider
<cache-path
name="image"
path="image/"/>
Aber wenn ich die Speicher Datei im Externen Cache-Dir,ich kann nicht " extern-cache-Pfad-tag oder so etwas wie, dass, um FileProvider.Und
<external-path
name="image_external"
path="cache/image/"/>
nicht helfen ,auch.
Dies ist mein Manifest-Datei:
<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>
Dies ist die xml/file_paths Datei:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<cache-path
name="image"
path="image/"/>
<external-path
name="image_external"
path="cache/image/"/>
</paths>
Und das ist mein Code:
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"));
- Und dies ist der Fehler-Informationen:
/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)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Update:
Der Weg zu gehen mit der Support Library 24.2.0 und oben ist, wie @ashughes sagt in seiner Antwort.
Version Sie Hinzugefügt zwei neue tags für die Durchführung von FileProvider.java in der Lage sein Verweis auf die externen Dateien und cache-Verzeichnisse.
Wenn Sie wollen zu Graben, mehr in Sie, können Sie einen Blick auf die änderungen auf dieser Begehen.
Original Antwort:
Ich hatte das gleiche problem. Ich warf einen Blick auf die Klasse
FileProvider.java
, und wie du schon sagtest, es gibt keinen tag für den externen cache-dir, nur die vier unten.Was ich tun ist verwenden Sie die
external-path
tag. Dieses tag verweist auf den root der externen Verzeichnis nicht in den cache ein. So können Sie entweder geben Sie den rest der Weg von dort zum cache-Verzeichnis aufpath
verwenden, oder Sie können einen Punkt, so weist es auf die root der externen Verzeichnis.Wenn Sie wurden mit
Die Methode
getFileForUri
war die überprüfung, ob der Pfad der Datei beginnt mit/storage/emulated/0/cache/image/
das tut es nicht, weil der Pfad der Datei ist/storage/emulated/0/Android/data/com.tizi.quanzi/cache/image/
. Und das ist der Grund, dass Sie immer die Ausnahme.external-cache-path
undexternal-files-path
widerspricht: developer.android.com/reference/android/support/v4/content/.... Das ist super nervig.external-cache-path
undexternal-files-path
zu arbeiten.Als der Support Library 24.2.0, die Sie verwenden können:
Sehen FileProvider docs für mehr details.
Folgende Konfiguration funktioniert bei mir:
Ich benutze
in meinem code.
und mein provider sieht wie folgt aus
mein min-sdk