Android:文件提供者"Failed to find configured root"
Android: FileProvider "Failed to find configured root"
我正在尝试使用 FileProvider 通过电子邮件共享 SQL 数据库文件。
错误:
java.lang.IllegalArgumentException: Failed to find configured root that contains /data/data/com.columbiawestengineering.columbiawest/databases/testresults.db
我的代码:
<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());
此外,goob 的 Logcat 显示了正确的数据库位置:
....../com.columbiawestengineering.columbiawest D/LOG PRINT SHARE DB: File goob..? getDatabasePath.. here it is: /data/data/com.columbiawestengineering.columbiawest/databases/testresults.db
有什么帮助吗?
从 developer.android 看来,xml files-path... 代表 files/ 子目录。但这不是存储文件的位置。我不知所措。
Also, Logcat for goob shows the correct db location:
是的,但这不是 <files-path>
指向的地方。鉴于该数据库路径,等效的 getFilesDir()
将是:
/data/data/com.columbiawestengineering.columbiawest/files
因此,您的数据库不在 getFilesDir()
目录中,<files-path>
使用的是 getFilesDir()
目录,这就是 FileProvider
不高兴的原因。 FileProvider
不支持共享数据库目录中的内容。
已解决(感谢@CommonsWare)。 FileProvider 无法访问 SQL 数据库文件,因为它位于数据库目录中。我只是将文件从数据库目录复制到文件目录(以便 FileProvider 可以访问它),添加权限,将其附加到电子邮件,然后在使用 start 和 onActivityForResult() 发送电子邮件时从文件目录中删除数据库方法。
我的 Java 现在看起来像这样:
//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());
这是我复制文件的方法:
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;
}
我正在尝试使用 FileProvider 通过电子邮件共享 SQL 数据库文件。
错误:
java.lang.IllegalArgumentException: Failed to find configured root that contains /data/data/com.columbiawestengineering.columbiawest/databases/testresults.db
我的代码:
<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());
此外,goob 的 Logcat 显示了正确的数据库位置:
....../com.columbiawestengineering.columbiawest D/LOG PRINT SHARE DB: File goob..? getDatabasePath.. here it is: /data/data/com.columbiawestengineering.columbiawest/databases/testresults.db
有什么帮助吗?
从 developer.android 看来,xml files-path... 代表 files/ 子目录。但这不是存储文件的位置。我不知所措。
Also, Logcat for goob shows the correct db location:
是的,但这不是 <files-path>
指向的地方。鉴于该数据库路径,等效的 getFilesDir()
将是:
/data/data/com.columbiawestengineering.columbiawest/files
因此,您的数据库不在 getFilesDir()
目录中,<files-path>
使用的是 getFilesDir()
目录,这就是 FileProvider
不高兴的原因。 FileProvider
不支持共享数据库目录中的内容。
已解决(感谢@CommonsWare)。 FileProvider 无法访问 SQL 数据库文件,因为它位于数据库目录中。我只是将文件从数据库目录复制到文件目录(以便 FileProvider 可以访问它),添加权限,将其附加到电子邮件,然后在使用 start 和 onActivityForResult() 发送电子邮件时从文件目录中删除数据库方法。
我的 Java 现在看起来像这样:
//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());
这是我复制文件的方法:
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;
}