调用摄像头拍照

调用摄像头拍照:

@Override
public void onClick(View v) {
    //创建File对象,用于存储拍照后的图片
    File outputImage = new File(getExternalCacheDir(),"output_image.jpg");
        try {
            if (outputImage.exists()) {
                outputImage.delete();
            }
            outputImage.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    if (Build.VERSION.SDK_INT >= 24){
        //将File对象转化为封装过的Uri对象
        imageUri = FileProvider.getUriForFile(MainActivity.this,"com.eventstest.fileprovider",outputImage);
    }else {
        //将File对象转化为Uri对象
        imageUri = Uri.fromFile(outputImage);
    }
    //启动相机程序
    Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
     //将Intent的action指定,并且putExtra()指定图片的输出地址。(隐式Intent)
    intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
    startActivityForResult(intent,TAKE_PHOTO);
    }

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case TAKE_PHOTO :
            if (resultCode == RESULT_OK) {
                try {
                    //将拍摄的图片显示出来
                    //将output_image.jpg图片解析成bitmap对象。然后设置
                    Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
                    picture.setImageBitmap(bitmap);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
            }
            break;
        default:
            break;
    }
}
  • 读写SD卡需要运行时权限处理,而是用关联目录可以跳过这一步
  • 如果低于Android7.0,调用Uri的fromFile()将File对象转化为Uri对象。否则调用FileProvider的getUriForFile()方法将File对象转化我一个封装过的Uri对象。
  • getUriForFile()接受三个参数1.Context 2.可以是任意唯一的字符串 3.刚创建的File对象。因为7.0开始直接使用本地真实的Uri被认为是不安全的。会抛出一个FileExposedException异常。而FileProvider是一种特殊的内容提供器,对数据进行了保护,可以选择性的将封装过的Uri共享给外部,从而提高安全性。

猜你喜欢

转载自blog.csdn.net/Adonis044/article/details/80040093