最近做项目遇到一个问题,调用其他相机拍照后,相册无法立即刷新,尝试了多种方法,包括发送广播等等,均无法达到要求。尝试一番后找到了解决途径,详见代码注释。
private Filefile;
private void openCamera() {
//照片保存路径
String cameraPath = Environment.getExternalStorageDirectory() +
File.separator + Environment.DIRECTORY_DCIM + File.separator +"Camera" + File.separator;
file =new File(cameraPath, Calendar.getInstance().getTimeInMillis() +".jpg"); try {
if (file.exists()){
file.delete();
}else {
file.createNewFile();
}
/**
* 此处涉及到了调用系统或其他应用的相机,所以必须使用以下方式获取uri,否则报错
* 但是,使用该类型URI却不能使相册立即更新(原因不详,可能与URI类型有关),要立即更新相册,必须使用Uri.fromFile(file)的方式实现,见onActivityResult()方法
*/
if (Build.VERSION.SDK_INT >=24){//7.0以上,**应用间**共享文件必须使用FileProvider,否则报错 FileUriExposedException,通过该方式获取的URI类型是content://********
Uri imageUri= FileProvider.getUriForFile(MainActivity.this,"any**********",file);
}else {
imageUri = Uri.fromFile(file);//7.0以下不需要,URI类型是file:///******,并且使用该类型URI可以达到立即刷新的效果
}
//启动相机
Intent intent =new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
startActivityForResult(intent,TAKE_PHOTO);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode ==TAKE_PHOTO && resultCode ==RESULT_OK){
//刷新相册,注意此处获取URI的方式是Uri.fromFile(file),而非通过FileProvider获取的。
//在应用内通过Uri.fromFile(file)获取URI是不会报错的
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
}
}
通过以上方法达到了预期效果,但是其中的机制还没有深入研究,观察结果是与Uri类型有关的,但是为什么content://****类型的Uri不能立即刷新相册,是否是因为这种类型Uri不能表达真实路径?欢迎拍砖解惑!