android 发送邮件附件

    这几天在研究如何在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以上。但是

这次的探索还是蛮有价值的。 :)

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值