在相机和图库之间进行选择以进行图像选择

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)并为这两个操作创建两个单独的方法。假设您创建了两个名为 btnPickGallerybtnTakePicture 的按钮。

两个按钮都会触发自己的操作,例如 onBtnPickGalleryonBtnTakePicture

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() 方法获取结果。

【讨论】:

以上是关于在相机和图库之间进行选择以进行图像选择的主要内容,如果未能解决你的问题,请参考以下文章

将相机图像上传到 Firebase

如果相机旋转,来自相机的图像为空

从图库/相机中选择后,图像尺寸变化[增加/减少]?

文件上传选项以从相机拍摄图像或从图库中选择不适用于 Mozilla Firefox 中的 Web 应用程序

从图库或相机中选择图像的对话框

从相机中选择图像时无法交付结果,但从图库中选择图像时没有问题