我想通过/data/data/com.myapp/app_profiles/profile_1/games/game_1.xml
共享文件ACTION_SEND
。
我已将其添加到清单中:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.myapp.fileprovider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
我的filepaths.xml
是
<paths>
<files-path path="app_profiles/profile_1/games/" name="myGame" />
</paths>
该代码(在XYActivity类中)为:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setItems(items, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
....
File file = FileManager.getGameFile(gameID);
Uri fileUri = FileProvider.getUriForFile(XYActivity.this,
"com.myapp.fileprovider", file);
我收到以下错误:
java.lang.IllegalArgumentException: Failed to find configured root that contains /data/data/com.myapp/app_profiles/profile_1/games/game_1.xml
at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:739)
...
我已经检查了文件浏览器,该文件确实存在!
关于我知道的文件对象
file.getPath() /data/user/0/com.myapp/app_profiles/profile_1/games/game_1.xml
file.getAbsolutePath() /data/user/0/com.myapp/app_profiles/profile_1/games/game_1.xml
file.getName() game_1.xml
file.getParent() /data/user/0/com.myapp/app_profiles/profile_1/games
对于filepaths.xml中的path
,我尝试了不同甚至错误的值:
path="app_profiles/profile_1/gamXes/"
path="app_profiles/profile_1/games/"
path="app_profiles/profile_1/games"
path="profile_1/games"
path="games/"
path="games"
path="."
path="../games/"
这不会改变任何事情。这表明它们全都错了,我只需要使用正确的值,但我不知道那是什么/为什么我的方法不起作用。
有几个类似的答案,它们对我不起作用
没有子目录:FileProvider error "Failed to find configured root that contains /data/data/sawbodeployer.entm.illinois.edu ..."
外部存储设备:File Provider: Failed to find configured root that contains,java.lang.IllegalArgumentException: Failed to find configured root that contains,还有更多
答案 0 :(得分:1)
/data/data/com.myapp/app_profiles/profile_1/games/game_1.xml
不是标准位置,并且FileProvider
不支持它。 <files-path>
用于getFilesDir()
,它将映射到/data/data/com.myapp/files/
,并且您的文件不在其中。
要么:
将文件存储在更好的位置(例如,目录getFilesDir()
之外),或者
编写自己的ContentProvider
,可以从所需位置提供文件