如何在onActivityResult回调中从从PDF选择器意图库获得的pdfUri获取文件路径?

时间:2018-08-24 07:11:41

标签: android pdf filechooser

参考同一类别中提出的问题,并对此进行扩展:

How to get the file path from a URI that points to a PDF document?

(How to get the file path from a URI that points to a PDF document?)

我的问题:

在我的HTC 816 Desire手机中[注:此设备已升级到MarshMallow,但仍然崩溃了KitKat。作为开发人员,我经历过Camera故意打开以获取其捕获的图像,从未释放其资源。当我尝试拍摄第二张照片时,这导致内部崩溃。],返回的路径以"/document/primary:"开头,并且保留在'pdfUri.getPath()'中,导致找不到文件异常。另外,当我在'MediaStore.Images.Media.DATA'中搜索时,返回的列索引为-1。

Q1。当列索引为-1时,我是否应该从文件路径中简单删除"/document/primary:"。因为在更高版本的手机(23及更高版本)中,此(pdfUri.getPath())可以正常工作,为我提供了正确的路径。

Q2。我应该在哪里获得手机的补丁程序来修复Camera resource not releasing错误,以及固件级别的其他错误。

如果没有正确提出问题,也请通过正确询问这个问题来指导我。

1 个答案:

答案 0 :(得分:1)

为了解决该问题,我尝试执行以下操作:

  1. 我将使解决方案获得的通用代码适用于PDF以外的许多其他文件格式:

    private String saveFileFromUri(Uri pdfUri){
        try{
            InputStream is=
            baseActivity.getContentResolver().openInputStream(pdfUri);
            byte[]bytesArray=new byte[is.available()];
            int read=is.read(bytesArray);
        //write to sdcard
    
        File dir=new File(Environment.getExternalStorageDirectory(),"/PRJ");
        boolean mkdirs=dir.mkdirs();
        File myPdf=new 
        File(Environment.getExternalStorageDirectory(),"/PRJ/myPdf.pdf");
        if(read==-1&&mkdirs){
    
        }
        FileOutputStream fos=new FileOutputStream(myPdf.getPath());
        fos.write(bytesArray);
        fos.close();
        //            System.out.println(fileString);
        return myPdf.getPath();
    }catch(FileNotFoundException e){
        e.printStackTrace();
    }catch(IOException e){
        e.printStackTrace();
    }
    return null;}
    
  2. 为了能够释放Camera资源,我将使用基于表面视图的Camera Activity,它可以做到这一点。这是代码的一部分:

发布相机资源:

    @Override
public void onPause() 
{
    super.onPause();

        if (mCamera != null){
            //              mCamera.setPreviewCallback(null);
            mPreview.getHolder().removeCallback(mPreview);
            releaseMediaRecorder();
            mCamera.release();        // release the camera for other applications
            mCamera = null;

        }
    }

    @Override
    public void onResume() {
        super.onResume();
        if (mCamera == null) {
            mCamera=getCameraInstance();
            mPreview = new CameraPreview(this.getActivity(), mCamera);
            preview.addView(mPreview);
        }
    }

快乐编码:-)