从其他应用程序可以访问的 getFilesDir() 设置 FileProvider?
Setup FileProvider from getFilesDir() which can access by others app?
假设我有一个应用程序 A (com.xxx.aaa) 的文件提供程序来自 getFilesDir()
拥有 xml
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<files-path name="files" path="."/>
</paths>
AndroidManifest:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.xxx.aaa.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/fileprovider_paths"/>
</provider>
在其他应用程序 B 上 (com.xxx.bbb)
想要求应用程序 A 对其来自 getFilesDir()
的文件进行一些处理,假设应用程序 A 已经知道应用程序 B 的文件名 (target.txt)
try{
Intent intent = new Intent("com.xxx.aaa.DO_SOMETHING_ON_TARGET");
intent.setClassName("com.xxx.aaa","com.xxx.aaa.TargetActivity");
File file = new File("/data/data/com.xxx.aaa/files/target.txt");
Uri contentUri = FileProvider.getUriForFile(context, "com.xxx.aaa.fileprovider", file);
intent.setData(contentUri);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Log.d(TAG, "setted fileprovider uri: "+contentUri);
context.startActivity(intent);
}catch(Exception e){
Log.e(TAG, "getUriForFile failed", e);
}
会输出异常:
IllegalArgumentException: Failed to find configured root /data/data/com.xxx.aaa/files/target.txt
这种方法只适用于一个应用程序吗?而且我别无选择来定义两个应用程序都能理解并在 intent.putExtra(key, ...)
?
上使用的自定义密钥
Is this approach only work within one app?
FileProvider.getUriForFile()
用于应用 自己的 FileProvider
。应用程序 B 没有 FileProvider
,更不用说为应用程序 A 配置了。此外,应用程序 B 无权访问该文件,因此它无法授予任何其他应用程序访问该文件的权限,就像您一样尝试使用 FLAG_GRANT_READ_URI_PERMISSION
.
And I have no choice to define custom key which both app understands and use it on intent.putExtra(key, ...)?
这似乎是一种直接的方法。
假设我有一个应用程序 A (com.xxx.aaa) 的文件提供程序来自 getFilesDir()
拥有 xml
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<files-path name="files" path="."/>
</paths>
AndroidManifest:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.xxx.aaa.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/fileprovider_paths"/>
</provider>
在其他应用程序 B 上 (com.xxx.bbb)
想要求应用程序 A 对其来自 getFilesDir()
的文件进行一些处理,假设应用程序 A 已经知道应用程序 B 的文件名 (target.txt)
try{
Intent intent = new Intent("com.xxx.aaa.DO_SOMETHING_ON_TARGET");
intent.setClassName("com.xxx.aaa","com.xxx.aaa.TargetActivity");
File file = new File("/data/data/com.xxx.aaa/files/target.txt");
Uri contentUri = FileProvider.getUriForFile(context, "com.xxx.aaa.fileprovider", file);
intent.setData(contentUri);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Log.d(TAG, "setted fileprovider uri: "+contentUri);
context.startActivity(intent);
}catch(Exception e){
Log.e(TAG, "getUriForFile failed", e);
}
会输出异常:
IllegalArgumentException: Failed to find configured root /data/data/com.xxx.aaa/files/target.txt
这种方法只适用于一个应用程序吗?而且我别无选择来定义两个应用程序都能理解并在 intent.putExtra(key, ...)
?
Is this approach only work within one app?
FileProvider.getUriForFile()
用于应用 自己的 FileProvider
。应用程序 B 没有 FileProvider
,更不用说为应用程序 A 配置了。此外,应用程序 B 无权访问该文件,因此它无法授予任何其他应用程序访问该文件的权限,就像您一样尝试使用 FLAG_GRANT_READ_URI_PERMISSION
.
And I have no choice to define custom key which both app understands and use it on intent.putExtra(key, ...)?
这似乎是一种直接的方法。