图片来自相机或画廊?
Posted
技术标签:
【中文标题】图片来自相机或画廊?【英文标题】:Picture coming from camera or gallery? 【发布时间】:2013-04-29 18:12:20 【问题描述】:我有一个意图选择器,可以让我从画廊或相机中选择图像,如下所示:
Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT,null);
galleryIntent.setType("image/*");
galleryIntent.addCategory(Intent.CATEGORY_OPENABLE);
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
Intent chooser = new Intent(Intent.ACTION_CHOOSER);
chooser.putExtra(Intent.EXTRA_INTENT, galleryIntent);
chooser.putExtra(Intent.EXTRA_TITLE, "title");
Intent[] intentArray = cameraIntent;
chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray);
startActivityForResult(chooser,REQUEST_CODE);
我希望我的onActivityResult
方法是这样的:
protected void onActivityResult(int requestCode, int resultCode, Intent data)
if(Condition == picture_coming_from_gallery)
//my code here
else if(condition == picture_coming_from_camera)
//another code here
什么条件可以让我知道我的图像来自哪个来源?
更新:
现在它正在工作,这是解决方案:
protected void onActivityResult(int requestCode, int resultCode, Intent data)
if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK)
if(data.getData()!=null)
try
if (bitmap != null)
bitmap.recycle();
InputStream stream = getContentResolver().openInputStream(data.getData());
bitmap = BitmapFactory.decodeStream(stream);
stream.close();
imageView.setImageBitmap(bitmap);
catch (FileNotFoundException e)
e.printStackTrace();
catch (IOException e)
e.printStackTrace();
else
bitmap=(Bitmap) data.getExtras().get("data");
imageView.setImageBitmap(bitmap);
super.onActivityResult(requestCode, resultCode, data);
感谢您的帮助!
【问题讨论】:
我建议您使用 GridView 来填充您的操作,并分配一个 OnItemClickListener 来捕获单击了哪个项目。 @ChorWaiChun - 他正在通过Intent
打开一个外部Activity
,因此他无法控制图片的显示。
@ianhanniballake 这就是为什么他应该通过 GridView 手动填充选择器,使用 Dialog 显示,而不是“打开外部 Avtivity”
【参考方案1】:
虽然当前的代码段是一种提供可供选择的选项的简洁方式,但我发现它非常难以管理。至少在我的用例中是这样。我需要存储从相机拍摄的图像,以便在 Aviary SDK 中进一步处理(如果用户选择)。
为此,我想提出一个解决方法。
这本身并不能解决您的问题。但考虑到您需要知道图像的来源(相机/画廊),提供了另一种选择。
AlertDialog.Builder builder = new AlertDialog.Builder(StatusUpdate.this);
builder.setTitle("Choose Image Source");
builder.setItems(new CharSequence[] "Gallery", "Camera",
new DialogInterface.OnClickListener()
@Override
public void onClick(DialogInterface dialog, int which)
switch (which)
case 0:
// GET IMAGE FROM THE GALLERY
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
Intent chooser = Intent.createChooser(intent, "Choose a Picture");
startActivityForResult(chooser, ACTION_REQUEST_GALLERY);
break;
case 1:
Intent getCameraImage = new Intent("android.media.action.IMAGE_CAPTURE");
File cameraFolder;
if (android.os.Environment.getExternalStorageState().equals
(android.os.Environment.MEDIA_MOUNTED))
cameraFolder = new File(android.os.Environment.getExternalStorageDirectory(),
"some_directory_to_save_images/");
else
cameraFolder= StatusUpdate.this.getCacheDir();
if(!cameraFolder.exists())
cameraFolder.mkdirs();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd'T'HHmmss");
String timeStamp = dateFormat.format(new Date());
String imageFileName = "picture_" + timeStamp + ".jpg";
File photo = new File(Environment.getExternalStorageDirectory(),
"some_directory_to_save_images/" + imageFileName);
getCameraImage.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));
initialURI = Uri.fromFile(photo);
startActivityForResult(getCameraImage, ACTION_REQUEST_CAMERA);
break;
default:
break;
);
builder.show();
这是结果(我仍然认为您的代码提供了更好的选择集,但同样,在您的用例或我的用例中都不是最简单的):
现在您可以根据选择的来源处理结果:
protected void onActivityResult(int requestCode, int resultCode, Intent data)
if (resultCode == RESULT_OK)
switch (requestCode)
case ACTION_REQUEST_GALLERY:
break;
case ACTION_REQUEST_CAMERA:
break;
;
更新:
找到了!!有一个answer here on SO 可以满足您的需求。它仍然是一种*解决方法*。从某种意义上说,它不依赖于不同的requestCodes
。但仍然有效。
奇怪的是,当我被困在这个问题上时,我错过了。 :-(
注意: 我没有在这里发布代码,而是链接到它。所有道具归原作者所有。 :-)
【讨论】:
是的,非常感谢,您的代码是另一种方法,这就是data.getData()
,当它为空时,您在相机盒中,当它不同时,它是画廊盒。
@HossamOukli:是的。我希望我也能早点找到这个。 ;-)【参考方案2】:
您可以使用 REQUEST_CODE 进行区分
private static final int PICK_FROM_CAMERA = 1;
private static final int PICK_FROM_GALLARY = 2;
/* For Image capture from camera */
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, PICK_FROM_CAMERA);
/* For Image capture from Gallary*/
startActivityForResult(new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI),
PICK_FROM_GALLARY);
public void onActivityResult(int requestCode, int resultCode, Intent intent)
super.onActivityResult(requestCode, resultCode, intent);
switch (requestCode)
case PICK_FROM_CAMERA:
if (resultCode == Activity.RESULT_OK)
Bitmap bitmapImage = (Bitmap) intent.getExtras().get("data");
break;
case PICK_FROM_GALLARY:
if (resultCode == Activity.RESULT_OK)
Uri mImageCaptureUri = intent.getData();
break;
【讨论】:
感谢您的帮助,这很好,除了一件事,这里没有意图选择器,我非常需要。以上是关于图片来自相机或画廊?的主要内容,如果未能解决你的问题,请参考以下文章
在 imageview 中使用时从相机或画廊拍摄的图片其方向发生变化,有时在 Android 中会垂直拉伸