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以上。但是

這次的探索還是蠻有價值的。 :)

 

 

 

 

 

 

發佈了39 篇原創文章 · 獲贊 6 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章