随笔-生活工作点滴

FileProvider以及相册刷新问题

2019-07-05  本文已影响1人  10号球衣

最近做项目遇到一个问题,调用其他相机拍照后,相册无法立即刷新,尝试了多种方法,包括发送广播等等,均无法达到要求。尝试一番后找到了解决途径,详见代码注释。


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不能表达真实路径?欢迎拍砖解惑!

上一篇下一篇

猜你喜欢

热点阅读