這幾天在研究如何在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以上。但是
這次的探索還是蠻有價值的。 :)