Activity中通过如下代码可以启动相机,然后再重写的onActivityResult方法中可以获取到返回的照片数据:

Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);startActivityForResult(openCameraIntent, TAKE_PICTURE);


假设照片大小在2M左右。在Android系统中bitmap占用4个字节,3200*2400*4=?,结果大家自己算算,如果为了一张图片,耗用这么大的内存,肯定是不合理的,并且,官方文档中有说明,Android系统分配给每个应用的最大内存是16M。

所以,系统为了防止应用内存占用过大,对于在应用内通过相机拍摄的图片最终返回来的结果进行了压缩,压缩后的图片变得很小,通过之前说的getData的方式只能满足比如显示个头像这样的需求。在onActivityResult方法里通过Intent的getData方法获取的数据转换成bitmap并显示在界面上,有时候会有取不到数据,或者显示的bitmap会非常小,如果将bitmap保存到sd卡后会发现,图片的分辨率很低,并且图片大小也是经过压缩的,不管将相机的像素设置多高,最后通过这种方式返回的bitmap总是经过压缩了的。如果想获得理想的照片大小和分辨率改如何处理呢?

解决方法:

1.拍照时,将拍得的照片先保存在本地,通过修改之前的代码如下:


Uri imageUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(),"image.jpg"))

//指定照片保存路径(SD卡),image.jpg为一个临时文件,每次拍照后这个图片都会被替换

openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);


如何调取相机拍照,代码如下:

/**拍照获取相片**/    private void doTakePhoto() {        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //调用系统相机                                            Uri imageUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(),"image.jpg"));        //指定照片保存路径(SD卡),image.jpg为一个临时文件,每次拍照后这个图片都会被替换        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);                                            //直接使用,没有缩小        startActivityForResult(intent, PHOTO_WITH_CAMERA);  //用户点击了从相机获取    }

在onActivityResult方法中再将图片取出,并经过缩小处理再显示在界面上或上传给服务器(压缩比例自定义)

@Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        if (resultCode == RESULT_OK) {            switch (requestCode) {            case TAKE_PICTURE:                //将保存在本地的图片取出并缩小后显示在界面上    Bitmap bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"/image.jpg");  Bitmap newBitmap = zoomBitmap(bitmap, bitmap.getWidth() / SCALE, bitmap.getHeight() / SCALE);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      //由于Bitmap内存占用较大,这里需要回收内存,否则会报out of memory异常                bitmap.recycle();                //将处理过的图片显示在界面上,并保存到本地                iv_image.setImageBitmap(newBitmap);                savePhotoToSDCard(newBitmap, Environment.getExternalStorageDirectory().getAbsolutePath(), String.valueOf(System.currentTimeMillis()));                break;            default:                break;            }        }    }

由于Androidbitmap分配的内存最大不超过8M,所以对使用完的较大的Bitmap要释放内存,调用其recycle()方法即可。



更多相关文章

  1. android 拍照或选择图片的实现方式//AtlerDialog的多种样式
  2. 自定义View实现图片的绘制、旋转、缩放
  3. Android(安卓)ImageView.ScaleType详解
  4. android中加载图片时出现oom
  5. android 常用Bitmap处理方法收集:普通裁剪,缩放,圆形裁剪
  6. TextView的使用
  7. Android中调用System.exit(0)
  8. Android(安卓)图片处理方法大全
  9. Android(安卓)内存相关 onTrimMemory,onLowMemory

随机推荐

  1. Android Studio v0.1试用
  2. Android笔记(1)——不同apk之间传递参数与
  3. android关于快捷方式的检测和添加
  4. Android 中文 API (90) ―― WindowManag
  5. Android通知Notification详解
  6. GPS 研究一 (Android2.3)
  7. LeakCanary源码分析
  8. Android IMF 学习笔记三
  9. Android(安卓)camera ISP相关 术语解释(
  10. Android中如何让手机屏幕不待机(PowerMana