美文网首页随笔-生活工作点滴
FileProvider以及相册刷新问题

FileProvider以及相册刷新问题

作者: 10号球衣 | 来源:发表于2019-07-05 22:14 被阅读1次

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

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

    相关文章

      网友评论

        本文标题:FileProvider以及相册刷新问题

        本文链接:https://www.haomeiwen.com/subject/yfbyhctx.html