ilo*_*mbo 12 email virtual android file
最终目标很快就会明确.
我想创建一个文件对象,而不是从真实的物理文件中获取数据,我想自己提供缓冲区.
然后,我想使用这个文件,它不是真正存在于SD卡中或我应用程序之外的任何地方,给它起一个名字并通过电子邮件作为附件发送(使用EXTRA_STREAM).
我发现以下一点代码,由Adriaan Koster(@adriaankoster),在Java中写入字节[]到文件
// convert byte[] to File
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bis);
File fileFromBytes = (File) ois.readObject();
bis.close();
ois.close();
System.out.println(fileFromBytes);
Run Code Online (Sandbox Code Playgroud)
我用它来创建这个功能
private File fileFromBytes(byte[] buf) {
File f = null;
try {
ByteArrayInputStream bis = new ByteArrayInputStream(buf);
ObjectInputStream ois = new ObjectInputStream(bis);
f = (File) ois.readObject();
bis.close();
ois.close();
}
catch (Exception e) {}
return f;
}
Run Code Online (Sandbox Code Playgroud)
这就是我被卡住的地方,因为当我使用它时:
// When sent as body the mail is sent OK
// emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, dump());
// When I try to attach the mail is empty
emailIntent.putExtra(android.content.Intent.EXTRA_STREAM, fileFromBytes(dump().getBytes()));
Run Code Online (Sandbox Code Playgroud)
我从示例中了解到,我看到第二个参数应该是一个URI,但是:我如何创建一个适合我文件的虚拟 URI?
编辑:
直接从应用程序中附加数据的选项对某些类型的应用程序很重要.也就是说,安全和银行应用程序不希望过多地移动敏感数据.当然,如果数据没有到达SD卡并直接进入邮件附件,则比在应用程序内存中更难嗅探.
这不是我的具体情况,但我想指出这种能力很重要.
我想,你要做的第一件事就是创建一个ContentProvider.您可以在此处查看示例实现
https://github.com/dskinner/AndroidWeb/blob/master/src/org/tsg/web/WebContentProvider.java
在上面链接的情况下,您可以将其添加到AndroidManifest.xml中
<provider
android:name="org.tsg.web.WebContentProvider"
android:authorities="your.package.name" />
Run Code Online (Sandbox Code Playgroud)
现在,您将拥有一个可供使用的内容uri content://your.package.name/.
您想要的上述ContentProvider部分,我想,是openFile方法.在应用程序中按意图共享数据时,需要进行某些操作.在您的情况下,您希望共享一些要附加到电子邮件的字节数据.
因此,如果您将内容uri传递到电子邮件应用程序(例如content://your.package.name/foo使用适当的意图标记),那么openFile将在您的ContentProvider上调用.在这种情况下,您可以检查uri段的结尾以查看是否foo已请求,并正确返回.
你提出的下一个问题是文件实际上没有在磁盘上.虽然我不能保证你上面使用的方法(虽然它看起来像犹太洁食),但你需要返回的是ParcelFileDescriptor来自你的ContentProvider.如果你查看我提供的链接,你可能会尝试使用它作为样本从你的File对象获取文件描述符(我的知识在这里放弃),但我想,数据根本就不可用.
你提到的是安全性.请务必注意,您可以私下将数据写入磁盘,这样只有应用才能访问数据.我相信,但您可能需要仔细检查,如果该数据是应用程序的私有数据,您可以通过ContentProvider公开它,并可能锁定提供商的使用者和方式,谁可以调用它等.您可以我想深入了解该部分的Android文档,或者查看其他一些SO问题.
无论如何,祝你好运.
| 归档时间: |
|
| 查看次数: |
4542 次 |
| 最近记录: |