简体   繁体   English

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

[英]How to get file path from the content uri for zip file?

I am triggering an intent for selecting a zip file and in onActivityResult, it is providing me a content URI.我正在触发选择 zip 文件的意图,并且在 onActivityResult 中,它为我提供了一个内容 URI。 For example:: (content://com.android.providers.downloads.documents/document/197).例如:: (content://com.android.providers.downloads.documents/document/197)。 The file which is selected is from the download folder.选择的文件来自下载文件夹。 Can any one explain, How to query the content resolver in order to get the file path?谁能解释一下,如何查询内容解析器以获取文件路径? Thanks.谢谢。

Already tried code :- 

   Cursor cursor = getActivity().getContentResolver()
                .query(contentUri, null, null, null, null);

        try {
            if (cursor != null && cursor.moveToFirst()) {
            String path=cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
                Log.i(TAG, "path  Name: " + path);
            }
           // NOTE :: Here I am getting the file name, But i want the file path.
        } finally {
            cursor.close();
        }

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.由于从 android Q 开始,谷歌建议 SAF(存储访问框架)从用户那里获取数据。 We cannot use Environment.getExternalStoragePublicDirectory() to get the file path from android Q and above.我们不能使用 Environment.getExternalStoragePublicDirectory() 从 android Q 及以上获取文件路径。

For android Q and above you can follow this steps.对于 android Q 及以上您可以按照此步骤操作。

1) Start the intent from the activity or fragment you want to trigger. 1)从您要触发的活动或片段开始意图。

For example:例如:

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) Then result will come in onActivityResult of your activity or fragment 2)然后结果将出现在您的活动或片段的onActivityResult中

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

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).从 uri 中提取数据(注意:对于图像、视频和音频,您可以参考开发者文档。由于没有找到任何合适的文件文档,因此给出了此示例)。

    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... 
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM