单一意图让用户拍照或从Android中的图库中选择图像

Dam*_*ian 66 camera android image gallery android-intent

我正在为Android 2.1开发一个应用程序.我想让我的用户在我的应用程序中选择个人资料图片(我没有使用联系人框架).

理想的解决方案是启动一个使用户能够从图库中选择图像的意图,但如果没有合适的图像,则使用相机拍照(反之亦然,即允许用户拍照,但如果他们知道他们已经有了合适的图像,让他们进入画廊并选择所述图像).

目前我可以做其中一个但不能两个都做.

如果我使用MediaStore.ACTION_IMAGE_CAPTURE直接进入相机模式,则无法进入图库.

如果我使用Intent.ACTION_PICK直接进入图库,那么我可以选择一个图像,但是如果我单击相机按钮(在图库的右上角),则会触发新的相机意图.因此,拍摄的任何照片都不会直接返回给我的应用程序.(当然你可以按后退按钮退回到图库并从那里选择图像,但这是一个额外的不必要的步骤,并不是很直观).

那么有没有办法将两者结合起来,或者我是否必须提供一个菜单来从我的应用程序中做一个或另一个?看起来这将是一个常见的用例...当然我错过了什么?

Mac*_*rse 119

你可以尝试做这样的事情:

// ...
// Within your enclosing Class
// ...
private static final int SELECT_PICTURE = 1;

// ... 

Intent pickIntent = new Intent();
pickIntent.setType("image/*");
pickIntent.setAction(Intent.ACTION_GET_CONTENT);

Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

String pickTitle = "Select or take a new Picture"; // Or get from strings.xml
Intent chooserIntent = Intent.createChooser(pickIntent, pickTitle);
chooserIntent.putExtra
(
  Intent.EXTRA_INITIAL_INTENTS, 
  new Intent[] { takePhotoIntent }
);

startActivityForResult(chooserIntent, SELECT_PICTURE);
Run Code Online (Sandbox Code Playgroud)

要了解如何处理活动结果,请参阅此问题


注意:关键点是如何确定是否使用了相机或图库.这个代码示例中显示了这个:https://stackoverflow.com/a/12347567/294884


Com*_*are 13

更新:另一个答案,使用EXTRA_INITIAL_INTENTS,在这一点上更好.在我写答案的时候,EXTRA_INITIAL_INTENTS还没有,因为它已经在API Level 5中添加了.

那么有没有办法将两者结合起来,或者我是否必须提供一个菜单来从我的应用程序中做一个或另一个?

编写自己的画廊,具有您想要的功能.

我认为菜单会更简单.

看起来这将是一个常见的用例...当然我错过了什么?

旁边的开发人员会认为图库应该允许您从本地图库中选择,或者跳到Flickr从那里进行选择.另一位开发人员会认为相机不仅应该允许通过相机"拍照",而且可以通过从画廊中选择一些内容来"拍照",从你想象的方式反转.另一位开发人员会认为图库应该允许从本地图库,Flickr或相机或网络连接的网络摄像头中进行选择.还有一个开发人员认为画廊是愚蠢的,用户应该只通过文件浏览器选择文件.等等.

所有这些都在一个环境(手机)中,操作系统的闪存是非常宝贵的.

因此,恕我直言,核心的Android团队选择为你按照你认为合适的方式组装构建块,而不是试图适应所有可能的模式,这并不完全令人震惊.

  • @hackbod ...除此之外没有提供使用相机的选项.拍摄照片需要MediaStore.ACTION_IMAGE_CAPTURE操作并选择现有图像需要Intent.ACTION_PICK操作...因此,它们基本上互相排斥,而不执行CommonsWare建议的操作 (6认同)
  • 通常,如果您想说"我希望用户为我选择X类某种类型的内容",您可以使用GET_CONTENT.例如,在这里你可以使用GET_CONTENT类型为image/*,它首先会向用户显示一个可以从中选择图像的东西列表(图库,相机以及其他任何应用程序都可以提供的图像). (4认同)

Dar*_*rux 10

您可以在Activity中以这种方式继续:

private static final int REQUEST_CODE_PICTURE= 1;

    /**
     * Click on View to change photo. Sets into View of your layout, android:onClick="clickOnPhoto"
     * @param view View
     */
    public void clickOnPhoto(View view) {
        Intent pickIntent = new Intent();
        pickIntent.setType("image/*");
        pickIntent.setAction(Intent.ACTION_GET_CONTENT);
        Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        String pickTitle = "Take or select a photo";
        Intent chooserIntent = Intent.createChooser(pickIntent, pickTitle);
        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { takePhotoIntent });
        startActivityForResult(chooserIntent, REQUEST_CODE_PICTURE);
    }
Run Code Online (Sandbox Code Playgroud)

然后,在您的Activity中添加方法onActivityResult:

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE_PICTURE && resultCode == Activity.RESULT_OK) {
            if (data == null) {
                return;
            }
            try {
                InputStream inputStream = getContentResolver().openInputStream(data.getData());
                Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                imgPhoto.setImageBitmap(bitmap);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 在``onActivityResult``中,只适用于``pickIntent``但不适用于``takePhotoIntent`` (5认同)