Выбор между камерой и галереей для выбора изображения
Я пытаюсь разрешить пользователю выбирать изображение либо из галереи, либо путем съемки с камерой. Я пробовал это:
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;
}