Android, 時々Web

Androidアプリを作ったり、Webサービスを作ったりする中で困ったことや詰まったことを解決したときの備忘録です。備忘録なので、正しい答えが書いてあるとは限りません。

暗黙的Intentで画像を渡す(表示、共有、編集)

Androidで他のアプリに何か処理を投げたいときには、Intentというものを使う。

明示的Intentと暗黙的Intentというものがあって、明示的Intentは呼び出したいActivityのClassを直接指定する。

暗黙的Intentは呼び出したいActivity(というかアプリ)の種類や、どういうことをしてほしいかといったことを設定して投げると「俺それ出来るよ!」ってアプリが担当してくれる。

 

ということは良く知られてることで、頻繁に使うことなんだけど、自分で作ったり保存した画像を他のアプリに渡したいときに、Intentに画像を指定する方法でハマった。

いろんな方法がインターネットに乗ってたけど、Intentを受け取ってはくれるものの画像が読み込めないで不正終了してしまうなんてことがよく合った。

デフォルトのギャラリーやGoogle謹製のフォトなんかもエラー落ちしてしまうということは、こっちのIntentの投げ方が悪いということだ。

 

結論からいって、こうすれば動いた。

画像はローカルにファイルとして保存されている必要があるらしい(そう思えない挙動をするアプリがあるから、必ずしもそうだとは限らないけど、それ以外に方法が見つからなかった)。 

    File file = new File("保存されている画像へのパス");
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), "image/png");
intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
startActivity(intent);

Intent.setActionで、アクションを指定する。

Intent.ACTION_VIEWを指定すると表示、
Intent.ACTION_SHAREを指定すると共有、
Intent.ACTION_EDITを指定すると編集を行うアプリを呼び出せる。

 

画像をDataとExtraの両方で指定するのがミソ。

受取先のアプリがどっちを必要としているかわからないので、両方指定することにした。

(というのも、VIEWとEDITはDataを指定するだけでうまく行ったのだが、SHAREはExtraにしないとうまくいかないことが多かった。)