从相机或画廊获取全尺寸图片
Posted
技术标签:
【中文标题】从相机或画廊获取全尺寸图片【英文标题】:Getting full sized picture from camera or gallery 【发布时间】:2012-11-07 09:49:57 【问题描述】:我正在尝试在注册过程中从用户那里获取图片。所以我有一个表单和一个按钮,可以启动相机、画廊、保管箱等,并要求用户选择或拍照。
在按钮 onClick 方法中,我正在使用本主题的第二个答案Allow user to select camera or gallery for image 中的示例,它会打开一个对话框,其中包含我的图像应用程序作为选项。拍摄或选择照片后,我在 onActivityResult 的代码如下:
Bundle extras = data.getExtras();
Bitmap mImageBitmap = (Bitmap) extras.get("data");
foto.setImageBitmap(mImageBitmap)
所以我有两个问题。首先,这只会得到一个缩略图,而不是我需要的全尺寸图片。其次,这仅在用户选择用相机拍摄新照片时才有效...
为了获得全尺寸图片,这段代码看起来不错android Camera Intent: how to get full sized photo?,但它仅适用于相机拍摄的照片,而且还有这个选择器意图,我不确定这段代码适合哪里。我应该验证女巫来源使用已选择吗?如果是这样,我该怎么做?
编辑:选择器意图为我提供了 4 个图像源选项:相机、图库、Dropbox 和 ASTRO 文件管理器。如果我安装了其他应用程序,当然会有更多选项可用。所以我检查了每个案例的意图内容:
CAMERA: act=inline-data (has extras)
DROPBOX and GALLERY: dat="file path"
ASTRO: dat="file path" (has extras)
所以验证意图是否有额外内容并不能告诉我来源。还有两者 data.hasExtra("act") 和 data.hasExtra("数据") 正在返回 false。
【问题讨论】:
你应该探索额外的内容。那里一定有什么东西。 我想任何全尺寸的图像都可以从意图中获得。如我发布的第二个链接所示,一种解决方案是将图像保存在 sdcard 上,而不是取回它。只是不知道如何知道从用户那里选择了哪个来源。 【参考方案1】:这是从相机捕获的图像中获取全尺寸图像的代码
声明对象
private File dir, destImage,f;
private String cameraFile = null;
private static final int CAPTURE_FROM_CAMERA = 1;
在你的活动中
dir = new File(Environment.getExternalStorageDirectory()
.getAbsolutePath(), "MyApp");
if (!dir.isDirectory())
dir.mkdir();
destImage = new File(dir, new Date().getTime() + ".jpg");
cameraFile = destImage.getAbsolutePath();
try
if(!destImage.createNewFile())
Log.e("check", "unable to create empty file");
catch(IOException ex)
ex.printStackTrace();
f = new File(destImage.getAbsolutePath());
Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(destImage));
startActivityForResult(i,CAPTURE_FROM_CAMERA);
在你的 onActivityResult 中
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode)
case CAPTURE_FROM_CAMERA:
if (resultCode==RESULT_OK)
if(f==null)
if(cameraFile!=null)
f = new File(cameraFile);
else
Log.e("check", "camera file object null line no 279");
else
Log.e("check", f.getAbsolutePath());
Bitmap useBitmap = BitmapFactory.decodeFile(f.getAbsolutePath());
// now use this bitmap wherever you want
break;
【讨论】:
我的代码使用选择器意图来允许用户选择想要的源。所以我的 onActivityResult 不仅应该处理(从相机捕获)场景,还应该处理从画廊、保管箱和其他第三个应用程序中选择的图片。这个chooserIntent 示例在本主题的第二个答案***.com/questions/4455558/…以上是关于从相机或画廊获取全尺寸图片的主要内容,如果未能解决你的问题,请参考以下文章