KDP(電子出版)のメモ 急急如律令

Amazon Kindleダイレクト・パブリッシングでの電子出版や電子書籍の作成販売について、文章やイラストの作成や編集方法について書いています。

androidのintentでpngとjpgの複数画像ファイルの選択方法

挿絵の場合は本文にファイル名が書かれているので、ファイル名から探索すればいい。表紙の場合は、ファイル名を直接渡す必要がある。SAFから呼び出した場合に複数ファイルを一括して処理をするとどれが表紙かわからなくなる。

本文ファイルと挿絵と表紙を一括で読み込みtxtかzipの場合に本文として選択、表紙は画像から表紙を選択する。

あなた:

androidのintentでpngとjpgの複数画像ファイルの選択方法

ChatGPT:

Androidの Intent を使用して、PNGとJPGの複数画像ファイルを選択する方法を紹介します。

  1. Intent を作成し、ACTION_OPEN_DOCUMENT を使用
  2. setType("image/*") で画像をフィルタリング
  3. putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true) で複数選択を許可
  4. startActivityForResult() でギャラリーを開く
  5. onActivityResult() で選択した画像を取得

Intent を作成し、ACTION_OPEN_DOCUMENT を使用

setType("image/*") で画像をフィルタリング

putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true) で複数選択を許可

startActivityForResult() でギャラリーを開く

onActivityResult() で選択した画像を取得

// ギャラリーを開く
private void openImagePicker() {
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
    intent.setType("image/*"); // すべての画像を対象(PNGやJPGを含む)
    intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); // 複数選択を許可
    intent.addCategory(Intent.CATEGORY_OPENABLE);

    startActivityForResult(intent, REQUEST_CODE_PICK_IMAGES);
}

// 結果を受け取る
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == REQUEST_CODE_PICK_IMAGES && resultCode == RESULT_OK) {
        if (data == null) {
            return;
        }

        List<Uri> imageUris = new ArrayList<>();

        // 複数選択
        if (data.getClipData() != null) {
            ClipData clipData = data.getClipData();
            for (int i = 0; i < clipData.getItemCount(); i++) {
                Uri uri = clipData.getItemAt(i).getUri();
                imageUris.add(uri);
            }
        }
        // 単一選択
        else if (data.getData() != null) {
            Uri uri = data.getData();
            imageUris.add(uri);
        }

        // 選択された画像を処理
        handleSelectedImages(imageUris);
    }
}

// 画像を処理するメソッド
private void handleSelectedImages(List<Uri> imageUris) {
    for (Uri uri : imageUris) {
        Log.d("Selected Image", "URI: " + uri.toString());
        // ここで表示やアップロード処理を行う
    }
}
  • Intent.ACTION_OPEN_DOCUMENT を使うことで、ストレージから画像を選択可能
  • EXTRA_ALLOW_MULTIPLE を true にすることで複数選択可能
  • data.getClipData() で複数の画像を取得
  • data.getData() で単一の画像を取得

Intent.ACTION_OPEN_DOCUMENT を使うことで、ストレージから画像を選択可能

EXTRA_ALLOW_MULTIPLE を true にすることで複数選択可能

data.getClipData() で複数の画像を取得

data.getData() で単一の画像を取得

これでPNGやJPGの画像を複数選択できます!

あなた:

jpgとpngだけに制限して

ChatGPT:

JPGとPNGのみに制限して画像を選択するには、Intent.ACTION_OPEN_DOCUMENT を使用し、MIMEタイプを "image/jpeg" と "image/png" に限定する必要があります。ただし、setType("image/*") ではMIMEタイプを1つしか指定できません。 そのため、EXTRA_MIME_TYPES を使って、複数のMIMEタイプをフィルタリングします。

// ギャラリーを開く(JPGとPNGのみに制限)
private void openImagePicker() {
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
    intent.setType("image/*"); // 一般的な画像タイプ
    intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); // 複数選択を許可
    intent.addCategory(Intent.CATEGORY_OPENABLE);

    // JPGとPNGのみを許可
    String[] mimeTypes = {"image/jpeg", "image/png"};
    intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);

    startActivityForResult(intent, REQUEST_CODE_PICK_IMAGES);
}

// 結果を受け取る
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == REQUEST_CODE_PICK_IMAGES && resultCode == RESULT_OK) {
        if (data == null) {
            return;
        }

        List<Uri> imageUris = new ArrayList<>();

        // 複数選択
        if (data.getClipData() != null) {
            ClipData clipData = data.getClipData();
            for (int i = 0; i < clipData.getItemCount(); i++) {
                Uri uri = clipData.getItemAt(i).getUri();
                imageUris.add(uri);
            }
        }
        // 単一選択
        else if (data.getData() != null) {
            Uri uri = data.getData();
            imageUris.add(uri);
        }

        // 選択された画像を処理
        handleSelectedImages(imageUris);
    }
}

// 画像を処理するメソッド
private void handleSelectedImages(List<Uri> imageUris) {
    for (Uri uri : imageUris) {
        Log.d("Selected Image", "URI: " + uri.toString());
        // ここで表示やアップロード処理を行う
    }
}
  • EXTRA_MIME_TYPES を使用して image/jpeg と image/png のみに制限
  • ACTION_OPEN_DOCUMENT を使用して外部ストレージからファイルを選択
  • EXTRA_ALLOW_MULTIPLE で複数選択可能
  • ClipData を使って複数の画像URIを取得

EXTRA_MIME_TYPES を使用して image/jpeg と image/png のみに制限

ACTION_OPEN_DOCUMENT を使用して外部ストレージからファイルを選択

EXTRA_ALLOW_MULTIPLE で複数選択可能

ClipData を使って複数の画像URIを取得

これでJPGとPNGのみに限定して複数画像を選択できます!

あなた:

次の処理を複数ファイルに対応させて

// 🔹 ファイル選択 UI を開く (SAF)
private final ActivityResultLauncher<Intent> filePickerLauncher =
        registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
            if (result.getResultCode() == RESULT_OK && result.getData() != null) {
                Uri uri = result.getData().getData();
                if (uri != null) {
                    copyFileToInternalStorage(uri);
                }
            }
        });

ChatGPT:

複数ファイル(JPGとPNG)の選択に対応するように ActivityResultLauncher を修正します。

ポイント:

  • getData().getClipData() を使って複数のファイルを取得
  • getData().getData() で単一ファイルを取得
  • 取得したすべての Uri を copyFileToInternalStorage() に渡して処理

getData().getClipData() を使って複数のファイルを取得

getData().getData() で単一ファイルを取得

取得したすべての Uri を copyFileToInternalStorage() に渡して処理

// 🔹 ファイル選択 UI を開く (SAF) - 複数ファイル対応
private final ActivityResultLauncher<Intent> filePickerLauncher =
        registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
            if (result.getResultCode() == RESULT_OK && result.getData() != null) {
                Intent data = result.getData();
                List<Uri> uriList = new ArrayList<>();

                // 複数ファイル選択
                if (data.getClipData() != null) {
                    ClipData clipData = data.getClipData();
                    for (int i = 0; i < clipData.getItemCount(); i++) {
                        uriList.add(clipData.getItemAt(i).getUri());
                    }
                }
                // 単一ファイル選択
                else if (data.getData() != null) {
                    uriList.add(data.getData());
                }

                // 選択されたすべてのファイルを処理
                for (Uri uri : uriList) {
                    copyFileToInternalStorage(uri);
                }
            }
        });

// 🔹 SAF を使ってファイル選択 UI を開く(JPG・PNG限定)
private void openFilePicker() {
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
    intent.setType("image/*"); // 一般的な画像
    intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); // 複数選択可能
    intent.addCategory(Intent.CATEGORY_OPENABLE);

    // JPG・PNG のみに制限
    String[] mimeTypes = {"image/jpeg", "image/png"};
    intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);

    filePickerLauncher.launch(intent);
}

✅ 複数ファイルの取得に対応

  • getClipData() を使って、複数選択時のすべてのファイル Uri を取得
  • getData() で単一選択の Uri を取得

getClipData() を使って、複数選択時のすべてのファイル Uri を取得

getData() で単一選択の Uri を取得

✅ JPGとPNGのみに制限

  • EXTRA_MIME_TYPES を使って image/jpeg と image/png のみ選択可能に

EXTRA_MIME_TYPES を使って image/jpeg と image/png のみ選択可能に

✅ すべての Uri を copyFileToInternalStorage(uri) に渡して処理

  • 1つずつ copyFileToInternalStorage(uri) を呼び出し

1つずつ copyFileToInternalStorage(uri) を呼び出し

このコードで、複数のJPG/PNGファイルを選択し、内部ストレージへコピーできます! 🚀