Android ImageView加载摄像头拍摄的大图

这个方法是从官方demo中摘录的,在此记录学习。

权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature
      android:name="android.hardware.camera2"
      android:required="false" />

设置变量保存文件存储路径

 private String mCurrentPhotoPath;

  /**
     * 拍照flag
     */
 private static final int REQUEST_IMAGE_CAPTURE_O = 2;

创建存储路径及文件名

 /**
     * 创建拍摄的图片的存储路径及文件名
     * @return
     * @throws IOException
     */
    private File createImageFile() throws IOException{
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "JPEG_" + timeStamp + "_";
        File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
        Log.d("TrainingFirstActivity", "storageDir:" + storageDir);
        File image = File.createTempFile(imageFileName, ".jpg", storageDir);
        mCurrentPhotoPath = image.getAbsolutePath();
        Log.d("image.getAbsolutePath()", image.getAbsolutePath() + "");
        return image;
    }

拍摄图片并保存

 Intent takePictureOintent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                if (takePictureOintent.resolveActivity(getPackageManager()) != null){
                    File photoFile = null;
                    try {
                        photoFile = createImageFile();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    if (photoFile != null){
                        takePictureOintent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
                        startActivityForResult(takePictureOintent, REQUEST_IMAGE_CAPTURE_O);
                    }
                }

处理并压缩拍照结果,takePhotoThenToShowImg是一个ImageView控件

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_IMAGE_CAPTURE_O && resultCode == RESULT_OK){
            int targetW = takePhotoThenToShowImg.getWidth();
            int targetH = takePhotoThenToShowImg.getHeight();

        /* Get the size of the image */
            BitmapFactory.Options bmOptions = new BitmapFactory.Options();
            bmOptions.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
            int photoW = bmOptions.outWidth;
            int photoH = bmOptions.outHeight;

        /* Figure out which way needs to be reduced less */
            int scaleFactor = 1;
            if ((targetW > 0) || (targetH > 0)) {
                scaleFactor = Math.min(photoW/targetW, photoH/targetH);
            }

        /* Set bitmap options to scale the image decode target */
            bmOptions.inJustDecodeBounds = false;
            bmOptions.inSampleSize = scaleFactor;
            bmOptions.inPurgeable = true;

        /* Decode the JPEG file into a Bitmap */
            Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);

        /* Associate the Bitmap to the ImageView */
            takePhotoThenToShowImg.setImageBitmap(bitmap);
            galleryAddPic();
        }
}

最后可以将拍摄到的照片添加到Media Provider的数据库中,以便图库或者其他程序读取照片

/**
     * 将拍摄到的照片添加到Media Provider的数据库中
     */
    private void galleryAddPic(){
        Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        File f = new File(mCurrentPhotoPath);
        Uri contentUri = Uri.fromFile(f);
        mediaScanIntent.setData(contentUri);
        this.sendBroadcast(mediaScanIntent);
    }

如果只需要缩略图的话,只要调摄像头拍摄直接处理结果就行

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK){//展示图片
            Bundle extras = data.getExtras();
            Bitmap imageBitmap = (Bitmap) extras.get("data");
            takePhotoThenToShowImg.setImageBitmap(imageBitmap);
        }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值