调用摄像头拍照:
@Override
public void onClick(View v) {
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){
imageUri = FileProvider.getUriForFile(MainActivity.this,"com.eventstest.fileprovider",outputImage);
}else {
imageUri = Uri.fromFile(outputImage);
}
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
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 {
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共享给外部,从而提高安全性。