如何从内容uri获取zip文件的文件路径? [英] How to get file path from the content uri for zip file?

查看:278
本文介绍了如何从内容uri获取zip文件的文件路径?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我触发了选择zip文件的意图,并且在onActivityResult中,它为我提供了内容URI.例如::(content://com.android.providers.downloads.documents/document/197).选择的文件来自下载文件夹.谁能解释一下,如何查询内容解析器以获得文件路径?谢谢.

I am triggering an intent for selecting a zip file and in onActivityResult, it is providing me a content URI. For example :: (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();
        }

推荐答案

我尝试了很多方法来从下载文件夹中的选定文件中检索文件路径.由于从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... 
    }

这篇关于如何从内容uri获取zip文件的文件路径?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆