写真選択ツール

デバイス上のメディア ファイルとともに写真選択ツール ダイアログが表示されます。アプリと共有する写真を選択します。
図 1. 写真選択ツールは、写真をアプリと共有するための直感的な UI です。

Android 13(API レベル 33)では、新しい写真選択ツールがサポートされています。この組み込みのツールは、メディア ライブラリ全体へのアクセス権をアプリに付与する必要なく、メディア ファイルを安全に選択できるものです。

メディアの選択

写真選択ツールは、メディア ライブラリが日付順(新しい順)に表示される、閲覧可能かつ検索可能なインターフェースです。写真のみの表示、動画のみの表示が指定できます。選択可能なメディアをデフォルトで 1 つに設定することも可能です。

共有制限の定義

アプリで android.provider.extra.PICK_IMAGES_MAX の値を宣言して、写真選択ツールに最大でいくつのメディア ファイルが表示されるかを設定できます。たとえば、アカウントに必須のプロフィール写真を選択することをユーザーに求める場合は、共有の上限として写真 1 枚を設定します。

写真選択ツールを単一選択モードで起動するには、次の手順を行います。

Kotlin

// Launches photo picker in single-select mode.
// This means that the user can select one photo or video.
val intent = Intent(MediaStore.ACTION_PICK_IMAGES)
startActivityForResult(intent, PHOTO_PICKER_REQUEST_CODE)

Java

// Launches photo picker in single-select mode.
// This means that the user can select one photo or video.
Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
startActivityForResult(intent, PHOTO_PICKER_REQUEST_CODE);

複数の写真または動画の選択

アプリのユースケースで、複数の写真または動画を選択する必要がある場合は、EXTRA_PICK_IMAGES_MAX エクストラを使用して画像選択ツールに画像をいくつまで表示するかを指定します。次のコード スニペットのようになります。

Kotlin

// Launches photo picker in multi-select mode.
// This means that user can select multiple photos/videos, up to the limit
// specified by the app in the extra (10 in this example).
val maxNumPhotosAndVideos = 10
val intent = Intent(MediaStore.ACTION_PICK_IMAGES)
intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, maxNumPhotosAndVideos)
startActivityForResult(intent, PHOTO_PICKER_MULTI_SELECT_REQUEST_CODE)

Java

// Launches photo picker in multi-select mode.
// This means that user can select multiple photos/videos, up to the limit
// specified by the app in the extra (10 in this example).
final int maxNumPhotosAndVideos = 10;
Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, maxNumPhotosAndVideos);
startActivityForResult(intent, PHOTO_PICKER_MULTI_SELECT_REQUEST_CODE);

指定できる最大のファイル数にはプラットフォームによる制限があることにご注意ください。この制限を参照するには、MediaStore#getPickImagesMaxLimit() を呼び出します。

写真選択ツールの結果の処理

写真選択ツールが起動したら、新しい ACTION_PICK_IMAGES インテントを使用して結果を処理します。選択ツールは URI のセットを返します。

Kotlin

// onActivityResult() handles callbacks from the photo picker.
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    super.onActivityResult(requestCode, resultCode, data)
    if (resultCode != Activity.RESULT_OK) {
        // Handle error
return
    }
    when (requestCode) {
            REQUEST_PHOTO_PICKER_SINGLE_SELECT -> {
            // Get photo picker response for single select.
            val currentUri: Uri = data.data

            // Do stuff with the photo/video URI.
            return
        }
                REQUEST_PHOTO_PICKER_MULTI_SELECT -> {
            // Get photo picker response for multi select.
            var i = 0
            while (i < data.clipData!!.itemCount) {

Java

// onActivityResult() handles callbacks from the photo picker.
@Override
protected void onActivityResult(
    int requestCode, int resultCode, final Intent data) {

    if (resultCode != Activity.RESULT_OK) {
        // Handle error
        return;
    }

    switch(requestCode) {
        case REQUEST_PHOTO_PICKER_SINGLE_SELECT:
            // Get photo picker response for single select.
            Uri currentUri = data.getData();

            // Do stuff with the photo/video URI.
            return;
        case REQUEST_PHOTO_PICKER_MULTI_SELECT:
            // Get photo picker response for multi select
            for (int i = 0; i < data.getClipData().getItemCount(); i++) {
                Uri currentUri = data.getClipData().getItemAt(i).getUri();

                // Do stuff with each photo/video URI.
            }
            return;
    }
}

写真選択ツールにはデフォルトで写真と動画の両方が表示されます。setType() メソッドで MIME タイプを設定すると、写真のみまたは動画のみでフィルタリングすることもできます。たとえば、写真選択ツールに動画のみを表示するには、次のように video/*setType() に渡します。

Kotlin

// Launches photo picker for videos only in single select mode.
val intent = Intent(MediaStore.ACTION_PICK_IMAGES)
intent.type = "video/*"
startActivityForResult(intent, PHOTO_PICKER_VIDEO_SINGLE_SELECT_REQUEST_CODE)

// Apps can also change the mimeType to allow users to select
// images only - intent.type = "images/*"

Java

// Launches photo picker for videos only in single select mode.
Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
intent.setType("video/*");
startActivityForResult(intent, PHOTO_PICKER_VIDEO_SINGLE_SELECT_REQUEST_CODE);

// Apps can also change the mimeType to allow users to select
// images only - intent.setType("image/*");
// or a specific mimeType - intent.setType("image/gif");