2016-04-07 16 views
0

Ich versuche, FileProvider zu verwenden, um eine SQL-Datenbankdatei per E-Mail zu teilen.Android: FileProvider "Fehler beim Suchen des konfigurierten Stammverzeichnisses"

Fehler:

java.lang.IllegalArgumentException: Failed to find configured root that contains /data/data/com.columbiawestengineering.columbiawest/databases/testresults.db 

Mein Code:

<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
<files-path name="test_results" path="databases/"/> 
</paths> 

Manifest.xml:

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

Java.code:

File goob = this.getDatabasePath("testresults.db"); 
    Log.d("LOG PRINT SHARE DB", "File goob..? getDatabasePath.. here it is: " + goob.toString()); 

    Uri contentUri = FileProvider.getUriForFile(this, "com.columbiawestengineering.columbiawest", goob); 
    Log.d("LOG PRINT SHARE DB", "contentUri got: here is contentUri: " + contentUri.toString()); 

Auch Logcat für Goob zeigt den korrekten db Standort:

....../com.columbiawestengineering.columbiawest D/LOG PRINT SHARE DB: File goob..? getDatabasePath.. here it is: /data/data/com.columbiawestengineering.columbiawest/databases/testresults.db 

Hilfe?

Von developer.android scheint es, dass der XML-Dateien-Pfad ... das Unterverzeichnis files/darstellt. Aber das ist nicht der Ort, an dem die Datei gespeichert wird. Ich bin ratlos.

Antwort

1

Also, Logcat for goob shows the correct db location:

Ja, aber das ist nicht, wo <files-path> Punkte. Da der Datenbankpfad, wäre das äquivalent getFilesDir() sein:

/data/data/com.columbiawestengineering.columbiawest/files 

Daher Ihre Datenbank ist nicht im getFilesDir() Verzeichnis, das, was <files-path> Anwendungen, weshalb FileProvider nicht glücklich ist. FileProvider unterstützt keine Freigabe von Inhalten aus dem Datenbankverzeichnis.

+0

Dank CommonsWare, das ist, was ich hatte Angst vor ... Gibt es eine andere Weg zur Datenbankdatei? Ich kann es auf eine Zeichenkette drucken und die Zeichenkette emailen, aber ich versuche, die tatsächliche Datenbankdatei emailen. –

+1

@DanLehto: ['getDatabasePath()' auf 'Context'] (http://developer.android.com/reference/android/content/Context.html#getDatabasePath (java.lang.String)) gibt Ihnen ein' Dateiobjekt, das auf Ihre Datenbank verweist. Sie können eine Kopie der Datei zu 'getFilesDir()' oder 'getCacheDir()' für die Zwecke von 'FileProvider' erstellen. Stellen Sie nur sicher, dass Ihre Datenbank zu diesem Zeitpunkt nicht verwendet wird. Oder ich werde in den nächsten Tagen ein Update auf [mein 'StreamProvider'] (https://github.com/commonsguy/cwac-provider) pushen, wo es möglich sein sollte, es zu erweitern, um die direkte Versorgung Ihrer Datenbank zu unterstützen . – CommonsWare

2

Gelöst (Danke @CommonsWare). FileProvider kann nicht auf die SQL-Datenbankdatei zugreifen, da sie sich im Datenbankverzeichnis befindet. Ich habe gerade die Datei aus dem Verzeichnis der Datenbanken in das Verzeichnis dir kopiert (damit FileProvider darauf zugreifen kann), Berechtigungen hinzugefügt, an die E-Mail angehängt und die Datenbank aus dem Verzeichnis dir gelöscht, wenn die E-Mail mit dem Start und onActivityForResult() gesendet wurde Methoden.

Meine Java wie folgt aussieht jetzt:

//this copies the .db file from dabases dir where FileProvider cannot access it and moves it to files dir 
    File booger = copyFileToFilesDir("testresults.db"); 
    Log.d("LOG PRINT SHARE DB", "we found a booger, Here it is: " + booger.toString()); 

    Uri contentUri = FileProvider.getUriForFile(this, "com.columbiawestengineering.columbiawest", booger); 
    Log.d("LOG PRINT SHARE DB", "contentUri got: here is contentUri: " + contentUri.toString()); 

und hier ist das, was ich die Datei kopieren tat:

private File copyFileToFilesDir(String fileName) { 
    File file = null; 
    String newPath = getFileStreamPath("").toString(); 
    Log.d("LOG PRINT SHARE DB", "newPath found, Here is string: " + newPath); 
    String oldPath = getDatabasePath("testresults.db").toString(); 
    Log.d("LOG PRINT SHARE DB", "oldPath found, Her is string: " + oldPath); 
    try { 
     File f = new File(newPath); 
     f.mkdirs(); 
     FileInputStream fin = new FileInputStream(oldPath); 
     FileOutputStream fos = new FileOutputStream(newPath + "/" + fileName); 
     byte[] buffer = new byte[1024]; 
     int len1 = 0; 
     while ((len1 = fin.read(buffer)) != -1) { 
      fos.write(buffer, 0, len1); 
     } 
     fin.close(); 
     fos.close(); 
     file = new File(newPath + "/" + fileName); 
     if (file.exists()) 
      return file; 
    } catch (Exception e) { 

    } 
    return null; 
}