15

Ich habe versucht, dem Android tutorial beim Freigeben von Dateien zu folgen. stelle ich die FileProvider so zusammen:IllegalArgumentException: Fehler beim Suchen des Konfigurationsstammverzeichnisses, das xxx in FileProvider.getUriForFile enthält

Auf der Haupt manifestieren xml:

<provider 
      android:name="android.support.v4.content.FileProvider" 
      android:authorities="com.example.mysecondapp.fileprovider" 
      android:exported="false" 
      android:grantUriPermissions="true" > 
      <meta-data 
       android:name="android.support.FILE_PROVIDER_PATHS" 
       android:resource="@xml/filepaths" /> 
     </provider> 

die res/xml/filpaths.xml Datei:

<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <external-path name="myexternalimages" path="SpCars_album/" /> 
</paths> 

Und in meinem Code Ich versuche, die folgenden:

File requestFile = new File(mImageFilenames[position]); 
       try { 
        fileUri = FileProvider.getUriForFile(
          SeventhActivity.this, 
          "com.example.mysecondapp.fileprovider", 
          requestFile); 
       } catch (IllegalArgumentException e) { 
        Log.e("File Selector", 
          "The selected file can't be shared: " + 
            mImageFilenames[position]); 
       } 

Die Anfragedatei wird mit einem richtigen instanziiert Arbeitspfad für eine Datei. Der Pfad dieser Datei beginnt genau mit dem, was getExternalFilesDir(Environment.DIRECTORY_PICTURES) zurückgibt. Ich kann nicht verstehen, was den Fehler verursacht, weil alles zu passen scheint. Vielen Dank im Voraus.

+1

könnten Sie die vollständige logcat-Ausgabe bereitstellen? – bbuecherl

+0

Dies ist die vollständige Logcat: http://pastebin.com/xbyMewHc – AndroidNewbie

Antwort

22

Der Pfad dieser Datei beginnt genau mit dem, was getExternalFilesDir (Environment.DIRECTORY_PICTURES) zurückgibt.

AFAIK, das gibt Ihnen kein Verzeichnis mit dem Namen SpCars_album/.

Ich kann einfach nicht verstehen, was den Fehler auslöst, weil alles zu passen scheint.

Die Datei, die Sie angegeben haben, kann nicht von der FileProvider aus Ihren definierten Wurzeln bedient werden.


UPDATE

habe ich vergessen, dass dies zu a documentation bug on FileProvider gebunden ist. FileProvider und <external-path> tut NICHT dienen Dateien von getExternalFilesDir(), sondern statt von Environment.getExternalStorageDirectory(). Ich habe a StreamProvider subclass that offers support for getExternalFilesDir() erstellt. Wenn Sie meinen StreamProvider verwenden und Ihren <external-path> durch <external-files-path name="myexternalimages" path="Pictures/SpCars_album/" /> ersetzen, sollten Sie mehr Glück haben.

+0

Dann vorausgesetzt, dass die Dateien, die ich möchte, sind in den folgenden Pfad: '/storage/emulated/0/Android/data/com.example. mysecondapp/files/Bilder/SpCars_Album/' Was soll ich in meiner Dateipfad-XML-Datei angeben? – AndroidNewbie

+0

@AndroidNewbie: Siehe aktualisierte Antwort. – CommonsWare

+0

Vielen Dank – AndroidNewbie

8

Dies ist eine alte Frage, aber ich hatte gerade ein ähnliches Problem.

Eine faule Lösung, die ich gefunden ist, einfach verwenden:

<external-path name="myexternalimages" path="Android/" /> 

Da getExternalStorageDirectory returns "/ storage/emulierten/0 /", die gemeinsame Nutzung/Android (die nächste Stufe nach unten) wird alle Dateien ermöglichen, die in Ihre App wird aufgerufen.

Alternativ, wenn Sie genauer sein möchten, können Sie dies tun:

<external-path name="myexternalimages" path="Android/data/YOUR_BUNDLE_ID/files/SpCars_album" /> 

Das fühlt sich nicht ganz richtig, aber es scheint zu funktionieren!

+0

Nice hack ,, aber super unsicher !!! –

+0

@eAj: Arbeitete wie ein Charme - IOU ein Bier – Chepech

+0

Warten Sie eine Sekunde, der Benutzer will eindeutig verwenden ** getExternalFilesDirs **, NICHT ** getExternalStorageDirectory **. Warum sollten wir '' anstelle von '' angeben? –

-6

Wenn Sie nicht versuchen, Ausnahme als IllegalArgumentException für FileProvider.getUriFoFile() zu fangen, wenn Sie Ihren Code ausführen, haben Sie auch diese Ausnahme.

try { 
    Uri uriForFile = FileProvider.getUriForFile(this,"com.fengfutong.bluetoothc2s.fileprovider", f); 
} catch (IllegalArgumentException e) { 
    e.printStackTrace(); 
}