
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");