我正在使用内容提供商将文件从一个(发送方)应用程序共享到另一个(接收方)应用程序。在发件人应用程序中,我有一个文件存储在内部存储器中。我正在使用发件人应用程序端的以下代码创建内容URI:
try {
File file = new File(path); //path is file path which is stored in internal storage
if (file.exists()) {
String uri = FileProvider.getUriForFile(DispatcherApp.mContext, AUTHORITY, file).toString();
intent.putExtra("uri", uri);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}
} catch (Exception e) {
e.printStackTrace();
}
发件人端的清单文件提供者代码:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="net.rhei.btchat"
android:exported="false"
android:process="@string/process"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
provider_path文件内容:
<paths>
<external-path
name="share_images"
path="Android/data/net.rhei.btchat/files/Pictures" />
<external-path
name="external_files"
path="." />
<files-path
name="files"
path="/" />
<cache-path
name="cache"
path="/" />
<external-files-path
name="external_files"
path="." />
<external-cache-path
name="external_cache"
path="." />
<files-path
name="allfiles"
path="/" />
<files-path
name="tmp"
path="tmp/" />
</paths>
使用此代码,我得到的文件uri像这样: 内容://net.rhei.btchat/files/shared/1/1569942820242
在接收方应用程序端,我正在使用以下代码读取文件内容:
收件人端的清单文件提供者代码:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.droidipc.androidipcpoc"
android:exported="false"
android:process="@string/process"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
使用以下代码读取文件内容:
Uri mUri = Uri.parse(file_uri); // here I'm getting file_uri = content://net.rhei.btchat/files/shared/1/1569942820242
String packageName = "com.droidipc.androidipcpoc";
context.grantUriPermission(packageName, mUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
try {
InputStream is = context.getContentResolver().openInputStream(mUri);
is.close();
} catch (Exception e) {
Log.e(SocketHandler.class.getSimpleName(), e.getMessage());
e.printStackTrace();
}
使用上述URI打开输入流时出现FileNotFound异常。