アプリからファイル添付のメールを送信しようとしています。
外部ストレージ(SDCard)に保存されたファイルは正常に添付できますが、getCacheDir()
メソッドを取得できる一時ディレクトリに保存された同じファイルは添付できません。
唯一の違いは、添付したいファイルが保存される場所です。これは Android の仕様または制限によるものですか、それとも何か不足していますか?
ACTION_SEND
添付ファイルをメールで送信するインテントを使用しています
//// getting file path to save
//[fail] -- no attatchment in email
//path = new StorageUtil().getCacheFilePath(this, "attatchment.html");
//[success] -- attatchment.html is on email
path = new StorageUtil().getExternalAppStoragePath(this, "attatchment.html");
/// start intent if file saving is successful
if (this.export(path)==true) {
Intent i = new Intent();
i.setAction(Intent.ACTION_SEND);
i.setType("text/html");
i.putExtra(Intent.EXTRA_SUBJECT, "a subject");
i.putExtra(Intent.EXTRA_TEXT, "");
File f = new File(path);
i.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(f));
startActivity(Intent.createChooser(i, "Send Email"));
}
getCacheFilePath() は、fileName がメソッドの 2 番目の引数である次のコードからパスを作成します。
File cacheDir = ctx.getCacheDir();
File cacheFile = new File(cacheDir, fileName);
return cacheFile.getPath(); //path
各パスは次のとおりです
//cache dir (attachcment failed):
/data/data/{PACKAGE_NAME}/cache/attachment.html
//external dir (attachment successed):
/mnt/sdcard/Android/data/{PACKAGE_NAME}/files/attachment.html
キャッシュディレクトリからファイルオブジェクトを取得しcanRead()
、ファイルの長さを取得できました。ありがとう!
==解決済み==
Gmail を送信すると、次のエラーがLogcatに表示されることがわかりました。
file:// attachment paths must point to file:///mnt/sdcard. Ignoring attachment file:///data/data/{PACKAGE_NAME}/cache/attachment.html"
したがって、これは Android の制限です。追加Intent.FLAG_GRANT_READ_URI_PERMISSION
しても効果はなく、Dropbox などの他のアクティビティも同様の結果になります。