我按照android docs的建议在内部存储上创建文件。准确地说,文件是在内部存储中的特定目录下创建的。我使用模式world_readable模式执行此操作。然后我尝试使用电子邮件程序附加文件。我能够连接文件,但发送电子邮件失败(似乎不是加载文件)我相信它是内部存储/许可的东西。
任何人都知道如何修复它或一个工作示例?将外部存储上的所有东西都转换成是很糟糕的。
谢谢
Ps:我检查了其他线程,他们似乎没有解决方案(旧线程)
答案 0 :(得分:9)
通过授予临时权限以将该文件作为共享意图的一部分进行共享,可以将应用程序本地存储中的文件共享到另一个应用程序(例如电子邮件附件)。
步骤1:将文件提供程序添加到AndroidManifest.xml:
<applicaton>
....
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.your.package.name.fileprovider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
</application>
步骤2:添加文件res / xml / filepaths.xml,其中包含您要共享的本地应用程序存储中文件的路径:
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<files-path name="myFolder" path="Folder/"/>
</paths>
步骤3:在您的java代码中创建文件共享意图:
Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND_MULTIPLE);
shareIntent.setType("text/plain");
shareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Your subject");
shareIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Your message");
ArrayList<Uri> uris = new ArrayList<Uri>();
String shareName = new String(pathToFile + filename);
File shareFile = new File(shareName);
Uri contentUri = FileProvider.getUriForFile(context, "com.your.package.name.fileprovider", shareFile);
uris.add(contentUri);
shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
// Grant temporary read permission to the content URI
shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
String msgStr = "Share...";
startActivity(Intent.createChooser(shareIntent, msgStr));
如果您遇到任何问题,请参阅此处的文档 https://developer.android.com/training/secure-file-sharing/share-file.html了解更多详情。
答案 1 :(得分:4)
我假设您正在尝试将该文件作为电子邮件附件发送 使用意图。
文件为空的原因是电子邮件应用程序没有 访问/ data / data / package_name / myfile_name中的文件,原因如下 机器人安全模型(/ data / data / package_name目录是 私有你的应用程序)。
要将文件添加为附件,您需要将其写入 公共存储(例如SD卡),以便电子邮件应用程序可以访问它。