Выбор между камерой и галереей для выбора изображения

Я пытаюсь разрешить пользователю выбирать изображение либо из галереи, либо путем съемки с камерой. Я пробовал это:

        Intent imageIntent = new Intent(Intent.ACTION_GET_CONTENT);
        imageIntent.setType("image/*");
        startActivityForResult(Intent.createChooser(imageIntent, "Select Picture"), GET_IMAGE_REQUEST);

но он автоматически отображает галерею, даже не предоставляя возможность выбора активности. Кажется, должен быть какой-то лучший способ сделать это, чем решение, данное в этом вопросе. Это действительно единственный способ сделать это?

Ответ 1

Вы должны сделать эту логику в своем приложении. Выбор изображения из галереи и съемка с использованием камеры используют разные намерения.

Я предлагаю вам использовать кнопку (или любой другой пользовательский интерфейс, чтобы заставить пользователя выбрать действие) и создает два отдельных метода для обоих действий. Скажем, вы создали две кнопки с именем btnPickGallery и btnTakePicture.

Обе кнопки запускают собственное действие, скажем onBtnPickGallery и onBtnTakePicture.

public void onBtnPickGallery() {
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(Intent.createChooser(intent, "Select Picture"), GALLERY_REQUEST_CODE);
}

public void onBtnTakePicture() {
    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    File photo = new File(Environment.getExternalStorageDirectory(), "dir/pic.jpg");

    Uri outputFileUri = Uri.fromFile(photo);

    cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
    startActivityForResult(cameraIntent, CAMERA_REQUEST_CODE);
}

И затем вы можете получить результат с помощью метода onActivityResult().

Ответ 2

Я объединил некоторые решения, чтобы сделать полный доступ для выбора изображения из галереи или камеры. Это функции ImagePicker util (также в Github lib):

  • Объединенные намерения для поиска галереи и камеры.
  • Измените размер больших изображений (например, 2500 x 1600).
  • Повернуть изображение, если необходимо

Скриншот:

Начальное намерение ImagePicker

Изменить. Вот фрагмент кода для совместного использования намерений для приложений Gallery и Camera. Вы можете увидеть полный код в ImagePicker util (также в Github lib)

public static Intent getPickImageIntent(Context context) {
    Intent chooserIntent = null;

    List<Intent> intentList = new ArrayList<>();

    Intent pickIntent = new Intent(Intent.ACTION_PICK,
            android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    takePhotoIntent.putExtra("return-data", true);
    takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(getTempFile(context)));
    intentList = addIntentsToList(context, intentList, pickIntent);
    intentList = addIntentsToList(context, intentList, takePhotoIntent);

    if (intentList.size() > 0) {
        chooserIntent = Intent.createChooser(intentList.remove(intentList.size() - 1),
                context.getString(R.string.pick_image_intent_text));
        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentList.toArray(new Parcelable[]{}));
    }

    return chooserIntent;
}

private static List<Intent> addIntentsToList(Context context, List<Intent> list, Intent intent) {
    List<ResolveInfo> resInfo = context.getPackageManager().queryIntentActivities(intent, 0);
    for (ResolveInfo resolveInfo : resInfo) {
        String packageName = resolveInfo.activityInfo.packageName;
        Intent targetedIntent = new Intent(intent);
        targetedIntent.setPackage(packageName);
        list.add(targetedIntent);
    }
    return list;
}