8

我试图允许用户从图库中或通过用相机拍照来选择图像。我试过这个:

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

但它会自动显示图库,甚至不提供选择活动的选项。似乎应该有比这个问题中给出的解决方案更好的方法来实现这一点。这真的是唯一的方法吗?

4

2 回答 2

14

我已经合并了一些解决方案,以制作一个完整的工具,用于从图库或相机中挑选图像。这些是ImagePicker util的功能(也在Github lib中):

  • 图库和相机请求的合并意图。
  • 调整所选大图像的大小(例如:2500 x 1600)
  • 必要时旋转图像

截屏:

ImagePicker 起始意图

编辑:这是一个将图库和相机应用程序合并的 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;
}
于 2015-09-09T09:26:09.410 回答
7

您应该在您的应用程序中执行此逻辑。从图库中挑选图像和使用相机拍照使用不同的意图。

我建议您使用按钮(或使用户选择操作的任何 UI)并为这两个操作创建两个单独的方法。假设您创建了两个名为btnPickGallery和的按钮btnTakePicture

两个按钮都会触发自己的动作,比如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()方法获取结果。

于 2011-06-02T19:16:45.740 回答