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团队选择为你按照你认为合适的方式组装构建块,而不是试图适应所有可能的模式,这并不完全令人震惊.
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)
归档时间: |
|
查看次数: |
42451 次 |
最近记录: |