Android 2系~5系で動く、intentでの画像取得にハマった(起動アプリ調整)

  • 45
    いいね
  • 2
    コメント
この記事は最終更新日から1年以上が経過しています。

もともとはシンプル

Intent intent = new Intent();
intent.setAction(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, REQUEST_CODE);

こんな感じで対応すれば動いていましたが、kitkatから対応方法が変わったのは有名ですね。

最初の対応方法

if (isKitkat) {
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    intent.setType("image/*");
    startActivityForResult(intent, REQUEST_CODE);
} else {
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_PICK);
    startActivityForResult(intent, REQUEST_CODE);
}

みたいな感じで、 ACTION_OPEN_DOCUMENTACTION_PICK を使い分けていました。

が、この実装方法だと起動するアプリがドキュメントになっちゃうし、要件によってはちょっと使いづらいものになっちゃうんです。
そうじゃないんだよ。俺は、 フォト とか ギャラリー アプリが起動して欲しいんだよ!って感じだったので調べました。

そこで対応したのがこちら

Intent intent = new Intent(Intent.ACTION_PICK,
    MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

intent.setType("image/*");

startActivityForResult(
    Intent.createChooser(
        intent,
        getResources().getString(chooseString)
    ),
    REQUEST_CODE);
  • ACTION_PICKMediaStore.Images.Media.EXTERNAL_CONTENT_URI という Uri を渡します。
  • 今回は不要でしたが、要件に合わせて intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true); など追加してください。
  • ついでに、 createChooser することで起動アプリの選択も行うように修正しました。

これで intent.getData(); すれば Uri が取得できますよ。

別の話

上記対応をしていて、 getData(); した返り値の処理が結構面倒でした。
content://com.google.android.apps.photos.contentprovider の場合とか色々ですね。
よかったら、みなさんも試してみてください。