我使用FileProvider API来共享实际存储在内部存储中的内容。
以下是我的xml配置,该配置与Manifiest文件中配置的Provider链接。
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<cache-path name="xs_audio" path="/audio/records"/>
</paths>
和我用来分享的代码如下:
private final static String FILE_PROVIDER = BuildConfig.APPLICATION_ID + ".fileprovider";
private String testPackageAppHaveAccess = "com.whats";
public static void shareDocument(Activity activity, CallRecordData data) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND_MULTIPLE);
intent.putExtra(Intent.EXTRA_SUBJECT, "Record File");
intent.setType("audio/*");
ArrayList<Uri> files = new ArrayList<>();
//for (AudioModelObj image : data.getDocuments()) {
files.add(getImageUri(activity, data.getFile()));
//}
activity.grantUriPermission(testPackageAppHaveAccess, files.get(0), Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, files);
activity.startActivity(Intent.createChooser(intent, "Share Audio File."));
}
private static Uri getImageUri(Activity activity, String audioURI) {
if (Build.VERSION.SDK_INT < 24) {
return Uri.parse(audioURI);
} else {
URI uri = URI.create(audioURI);
File file = new File(uri);
return FileProvider.getUriForFile(activity, FILE_PROVIDER, file);
}
}
}
但是在使用应用程序启动时,它没有附加任何内容。在gmail的情况下,它说&#34;不能附加空文件&#34;。文件确认可用,因为我显示文件列表和播放。
供参考:从getImageUri(..)生成的Uri是
/data/user/0/com.xl.cl.debug/cache/audio/records/17-10-17_170728_abc_.wav
有什么建议我做错了吗?
答案 0 :(得分:2)
<files-path>
已经指出某些设备上的内容/data/user/0/com.xl.cl.debug
<cache-path>
是您应该使用的内容,将path
替换为感兴趣的子目录(audio/records
),取消/data/user/0/com.xl.cl.debug/cache
位
您正在调用grantUriPermission()
,其中第一个参数不是包
您正在调用grantUriPermission()
,其中第一个参数不是标识您要向其授予权限的应用的包
您没有将FLAG_GRANT_READ_URI_PERMISSION
添加到Intent
,这是一种典型的说法,“收件人应该可以阅读此Uri
Intent
这个Intent
“(尽管ACTION_SEND_MULTIPLE
可能需要更多的工作,因为我没有那么多玩过)
人类历史记录中没有文件系统路径以content:/
开头,所以摆脱
调用new File()
并提供非文件系统路径的值不会很好用
可能会出现更多问题,但这应该让你开始