Выбор между камерой и галереей для выбора изображения - PullRequest
6 голосов
/ 02 июня 2011

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

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

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

Ответы [ 2 ]

12 голосов
/ 09 сентября 2015

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

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

Скриншот:

ImagePicker starting intent

Редактировать : Вот фрагмент кода, который позволяет объединить Намерение для приложений Галерея и Камера. Вы можете увидеть полный код в 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;
}
6 голосов
/ 02 июня 2011

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

Я предлагаю вам использовать кнопку (или любой другой пользовательский интерфейс, чтобы заставить пользователя выбрать действие) и создать два отдельных метода для обоих действий.Допустим, вы создали две кнопки с именами 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().

...