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

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

理想的解决scheme是激发使用户从图库中select图像的意图,但是如果没有合适的图像,则使用相机拍照(反之亦然,即允许用户拍照,但如果他们知道他们已经有一个合适的形象,让他们进入画廊,并select图像)。

目前我可以做一个或另一个,但不是两个。

如果我使用MediaStore.ACTION_IMAGE_CAPTURE直接进入相机模式,则没有选项可以放入相册。

如果我使用Intent.ACTION_PICK直接进入画廊,那么我可以select一个图像,但是如果单击相机button(在画廊的右上angular),则会启动新的相机意图。 所以,所拍摄的任何图片都不会直接返回给我的应用程序。 (当然,你可以按下后退button回到画廊,从那里select图像,但这是一个额外的不必要的步骤,并不直观)。

那么有没有办法将两者结合起来,还是我将不得不提供一个菜单来在我的应用程序中做一个或另一个? 似乎这将是一个常见的用例…当然,我失去了一些东西?

更新 :另一个答案,使用EXTRA_INITIAL_INTENTS ,在这一点上是一个更好的答案。 在我写回答的时候, EXTRA_INITIAL_INTENTS还不存在,因为它是在API Level 5中添加的。

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

写你自己的画廊,有你想要的function。

我想菜单会更简单。

似乎这将是一个常见的用例…当然,我失去了一些东西?

您旁边的开发人员会认为该画廊应该允许您从本地画廊中select,或跳出到Flickr从那里进行select。 另一位开发人员认为,摄像机不仅应该允许通过摄像机“拍照”,而且还可以通过从画廊中select一些东西来“拍照”,从而按照您设想的方式转换。 还有一位开发人员会认为,画廊应该允许从当地的画廊,Flickr,或相机,或networking摄像头采摘。 还有一个开发者会认为这个库是愚蠢的,用户应该通过文件浏览器来select文件。 等等。

所有这一切都在一个环境(手机),其中操作系统的闪存是非常重要的。

因此,恕我直言,核心的Android团队select为您提供构build块,而不是尝试适应每种可能的模式,这并不是完全令人震惊的。

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

 // ... // 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); 

要了解如何处理活动的结果,请参考这个问题


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

您可以在您的活动中以这种方式继续:

 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); } 

然后,在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(); } } }