【问题标题】: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 中给出的解决方案更好的方法来实现这一点。这真的是唯一的方法吗?

【问题讨论】:

    标签: android android-intent android-camera android-gallery android-intent-chooser


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-20
      • 2010-12-20
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      • 2011-01-29
      • 2010-12-06
      • 2012-04-13
      相关资源
      最近更新 更多