4

我试图让用户从图库或通过使用相机拍摄图片来选择图像。我试过这个:在相机和图库之间选择图像选择

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

但它自动显示画廊,甚至没有提供选择活动的选项。似乎应该有一些更好的方法来完成这个比this question给出的解决方案。这真的是唯一的办法吗?

回答

5

你应该在你的应用程序中做这个逻辑。从画廊中挑选图像和使用相机拍摄照片的用途各不相同。

我建议你使用按钮(或任何用户界面,使用户选择一个动作),并为两个动作创建两个单独的方法。假设您创建了两个按钮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()方法获取结果。

8

我已经合并了一些解决方案,以便从Gallery或Camera中选取图片的完整util。这些都是ImagePicker util(也以Github lib)功能:

  • 的画廊和相机resquests合并意向。
  • 调整所选大的图像(例如:2500×1600)
  • 旋转图像如果necesary

截图:

ImagePicker starting 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; 
} 
+0

谢谢,这正是我一直在寻找(与OP过,我打赌)。我只是对代码进行了一些修改(例如删除内部的类包装'rotateOrientationCall'和类似的东西),但它运行得非常好^^ – Ilario 2015-09-14 08:50:33

+0

感谢@llario随意分发或评论要点以改进代码。 – 2015-09-14 09:21:27

+1

我改进了图库图像的旋转和调整大小的方法。一探究竟。 – 2015-10-02 09:38:39