且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何从内容uri获取zip文件的文件路径?

更新时间:2023-02-23 20:42:01

我尝试了很多方法来从下载文件夹中的选定文件中检索文件路径.由于从android Q开始,谷歌建议使用SAF(存储访问框架)从用户那里获取数据.我们无法使用Environment.getExternalStoragePublicDirectory()从android Q及更高版本获取文件路径.

I tried so many methods to retrieve the file path from the selected file in download folder. Since from android Q on-wards google suggested SAF(Storage Access Framework) to get the data from the user. We cannot use Environment.getExternalStoragePublicDirectory() to get the file path from android Q and above.

对于android Q及更高版本,您可以按照以下步骤操作.

For android Q and above you can follow this steps.

1)从要触发的活动或片段开始意图.

1) Start the intent from the activity or fragment you want to trigger.

例如:

public void performFileSearch() { //from developer docs

    // ACTION_OPEN_DOCUMENT is the intent to choose a file via the system's file
    // browser.
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);

    // Filter to only show results that can be "opened", such as a
    // file (as opposed to a list of contacts or timezones)
    intent.addCategory(Intent.CATEGORY_OPENABLE);

    // Filter to show only images, using the image MIME data type.
    // If one wanted to search for ogg vorbis files, the type would be "audio/ogg".
    // To search for all documents available via installed storage providers,
    // it would be "*/*".
    intent.setType("application/pdf"); // MIME type for what file you required

    startActivityForResult(intent, READ_REQUEST_CODE);
}

2)然后结果将出现在您的活动或片段的onActivityResult中

2) Then result will come in onActivityResult of your activity or fragment

@Override
public void onActivityResult(int requestCode, int resultCode,
        Intent resultData) { // from developer docs

    // The ACTION_OPEN_DOCUMENT intent was sent with the request code
    // READ_REQUEST_CODE. If the request code seen here doesn't match, it's the
    // response to some other intent, and the code below shouldn't run at all.

    if (requestCode == READ_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
        // The document selected by the user won't be returned in the intent.
        // Instead, a URI to that document will be contained in the return intent
        // provided to this method as a parameter.
        // Pull that URI using resultData.getData().
        Uri uri = null;
        if (resultData != null) {
            uri = resultData.getData();
            Log.i(TAG, "Uri: " + uri.toString());
            processWithUriToGetPath(uri);
        }
    }
}

从uri中提取数据(注意:对于图像,视频和音频,您可以参考开发人员文档.由于找不到适合文件的文档,因此给出了此示例).

Extracting data from uri(Note: For image,video and audio you can refer developer document.Since didn't find any proper document for file, giving this example).

    private void processWithUriToGetPath(Uri contentUri) {
        //Use content Resolver to get the input stream that it holds the data and copy that in a temp file of your app file directory for your references
         File selectedFile = new File(getActivity().getFilesDir(), "your file name"); //your app file dir or cache dir you can use
       InputStream in = getActivity().getContentResolver().openInputStream(contentUri);
                 OutputStream out = new FileOutputStream(selectedFile);
                        try {
                            byte[] buf = new byte[1024];
                            int len;
                            if (in != null) {
                                while ((len = in.read(buf)) > 0) {
                                    out.write(buf, 0, len);
                                }
                                out.close();
                                in.close();
                            } catch (IOException ie) {
                            ie.printStackTrace();
                        }


 //after this you will get file from the selected file and you can do 
           whatever with your wish.
         // Hope it helps... 
    }