这几天在研究如何在App内部call mail的客户端去发送邮件到特定的地址。遇到一个比较麻烦的问题,
在邮件中要附带比较大size的附件,若干m,这个数据本身是一个inputSteam,如果先保存到Sdcard或者
是内部的存储设备上固然是没问题的,但是如果空间不够,或者根本就没有sdcard那就麻烦了。
具体一步步分析下:
1.在APP内部要call发邮件,很简单,start一个intent就行了
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_EMAIL, address_to);
intent.putExtra(Intent.EXTRA_CC, address_cc);
intent.putExtra(Intent.EXTRA_SUBJECT,subject);
intent.putExtra(Intent.EXTRA_TEXT, header);
intent.putExtra(Intent.EXTRA_STREAM, Uri.parse(uri_string));//这就是发送附件的关键。
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(Intent.createChooser(intent, getString(R.string.send_log_text)));
这里明确了发送附件就是要给它一个uri,但是如果数据源是一个inputStream的话怎么才能包装
成一个uri呢?郁闷了。
2.看来ContentProvider是肯定要了,尝试在它提供的接口中将inputSteam包装成uri。
发现邮件客户端在读取实际附件数据的时候会来call
public ParcelFileDescriptor openFile(Uri uri, String mode)
这个方法,那是不是意味着只要将inputStream最终构造成一个ParcelFileDescriptor就可以了呢?
3.ParcelFileDescriptor有很多返回ParcelFileDescriptor的静态方法,貌似ParcelFileDescriptor.fromFd
是我需要的,只要能拿到inputStream的fd就万事ok了。
幸好,我这个inputStream是一个FileinputStream,所以能拿到FileDescriptor,可是要拿到int的fd貌似不容易,
getint方法不公开,只能投机取巧了。
FileInputStream f =((FileInputStream)(process.getInputStream()));
String t=f.getFD().toString();
String tt=t.subSequence(15, t.length()-1).toString();
虽然方法很丑陋,但是问题还是可以解决的。
最后由于ParcelFileDescriptor.fromFd 是level-13的,所以这个方法只能局限在1以上。但是
这次的探索还是蛮有价值的。 :)