在相机和图库之间进行选择以进行图像选择
Posted
技术标签:
【中文标题】在相机和图库之间进行选择以进行图像选择【英文标题】:Choosing between camera and gallery for image selection 【发布时间】:2011-09-07 06:59:38 【问题描述】:我正在尝试允许用户从图库中或通过使用相机拍照来选择图像。我试过这个:
Intent imageIntent = new Intent(Intent.ACTION_GET_CONTENT);
imageIntent.setType("image/*");
startActivityForResult(Intent.createChooser(imageIntent, "Select Picture"), GET_IMAGE_REQUEST);
但它会自动显示图库,甚至不提供选择活动的选项。似乎应该有比this question 中给出的解决方案更好的方法来实现这一点。这真的是唯一的方法吗?
【问题讨论】:
【参考方案1】:我已经合并了一些解决方案,以制作一个完整的工具,用于从图库或相机中挑选图像。这些是ImagePicker util 的功能(也在Github lib 中):
图库和相机请求的合并意图。 调整所选大图像的大小(例如:2500 x 1600) 必要时旋转图像截图:
编辑:这里有一段代码用于将图库和相机应用的 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;
【讨论】:
谢谢,这正是我想要的(我敢打赌,OP 也是如此)。我只是稍微完善了代码(例如删除内部类包装rotateOrientationCall
和类似的小东西),但它工作得非常好^^
感谢 @llario 随时 fork 或评论要点以改进代码。
我改进了图库图片的旋转和调整大小的方法。看看吧。
虽然给定的链接可能会回答问题,但最好在此处包含代码的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。我们希望在 SO 上保留自包含的答案。
谢谢@MarioVelasco,虽然我根据需要调整了一些参数。【参考方案2】:
您应该在您的应用程序中执行此逻辑。从图库中挑选图像和使用相机拍照使用不同的意图。
我建议您使用按钮(或使用户选择操作的任何 UI)并为这两个操作创建两个单独的方法。假设您创建了两个名为 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()
方法获取结果。
【讨论】:
以上是关于在相机和图库之间进行选择以进行图像选择的主要内容,如果未能解决你的问题,请参考以下文章