【问题标题】:How to get full path from Intent.ACTION_GET_CONTENT?如何从 Intent.ACTION_GET_CONTENT 获取完整路径?
【发布时间】:2019-10-16 20:40:42
【问题描述】:

我正在尝试将所选文件(不限于图像,它可以是任何文件)从文件选择器意图放入 zip 文件。我需要完整的文件路径来执行此操作,但意图仅提供 uri 路径。

  1. 我尝试过 .getPath() 但这并没有给出文件的真实路径
  2. 我试过 getRealPathFromRealURI:android get real path by Uri.getPath()
  3. 我试过 File file = new File(), file.getPath()

这是我的代码:

    public void onActivityResult(int requestCode, int resultCode, Intent result){
        if(requestCode == 111) {
            if(null != result) { // checking empty selection
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                    if(null != result.getClipData()) { // checking multiple selection or not
                        for(int i = 0; i < result.getClipData().getItemCount(); i++) {
                            String uri = result.getClipData().getItemAt(i).getUri().getPath();
                            uriList.add(uri);
                            Log.d("PATH: ",uri);
                        }
                        confirmationDialog();
                    } else {
                        String uri = result.getData().getPath();
                        uriList.add(uri);
                        Log.d("PATH: ",uri);
                        confirmationDialog();
                    }
                }else{Toast.makeText(getApplicationContext(),
                        "An error has occured: API level requirements not met",Toast.LENGTH_SHORT).show();};
            }
        }
    }

它应该给出真实的路径,例如:“/sdcard/filename.example”

相反,它给了我:“/document/9016-4ef8:filename.example”

【问题讨论】:

  • 完整的file path需要什么?
  • 停止文件未找到异常。
  • 试试file.getAbsoultePath()
  • result.getData() 将为您提供 URI 本身(即 content://)。

标签: java android


【解决方案1】:
Uri selectedImage = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };

Cursor cursor = getContentResolver().query(selectedImage,filePathColumn, null, null, null);
cursor.moveToFirst();

int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);

cursor.close();
System.out.println("picturePath +"+ picturePath );  //path of sdcard

在这里找到:Get Real Path For Uri Android

【讨论】:

    【解决方案2】:

    选择/获取文件的实际路径:

    val intent = Intent(Intent.ACTION_GET_CONTENT)
    intent.type = "*/*"
    startActivityForResult(intent, 1)
    

    onActivityResult:

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == 1 && resultCode == Activity.RESULT_OK) {
            val file = data?.data?.let {
                getFileFromUri(requireContext().contentResolver, uri, requireContext().cacheDir)
            }
        }
    }
    

    获取文件:

    private fun getFileFromUri(contentResolver: ContentResolver, uri: Uri, directory: File): File {
        val file =
            File.createTempFile("suffix", ".prefix", directory)
        file.outputStream().use {
            contentResolver.openInputStream(uri)?.copyTo(it)
        }
    
        return file
    }
    

    一旦我们得到文件,我们就可以得到文件的实际路径。

    【讨论】:

      【解决方案3】:

      好的,我通过使用内置文件资源管理器之外的另一个文件资源管理器来修复它,在我的情况下,我使用 Cx 文件资源管理器,不同的文件资源管理器返回不同的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-13
        • 2011-12-11
        • 2014-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-14
        • 2018-08-13
        相关资源
        最近更新 更多