首页 > 解决方案 > 如何在 onActivityResult 回调中从 PDF 选择器意图库获得的 pdfUri 获取文件路径?

问题描述

参考在同一类别中提出的问题,并作为对此的扩展:

如何从指向 PDF 文档的 URI 中获取文件路径?

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

我的问题:

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

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

Q2。我应该从哪里获得手机补丁来修复Camera resource not releasing错误,并且固件级别还有其他错误。

如果没有准确地问到这个问题,也请指导我正确地问这个问题。

标签: androidpdffilechooser

解决方案


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

  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. 为了能够释放相机资源,我将使用基于表面视图的相机活动,它允许这样做。这是代码的一部分:

释放相机资源:

    @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);
        }
    }

快乐编码:-)


推荐阅读