获取用户选择的文件的名称和路径,而不管它在 Android 中的位置 [内部或外部存储器中]?

Get the user selected file's name and path irrespective of its location [ either in internal or external memory ] in Android?

我想获取用户选择的任何 Excelsheet 的 [名称和路径],而不是下面代码中的硬编码存储位置,用于数据导入操作。发现 getExternalStorageDirectory 已被弃用,不确定如何实现从 Android.

Internal / External 存储访问 Excelfile 的要求
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (data == null)
        return;

    switch (requestCode) {
   
        case imrequestcode:

        // Need help at this LOC where filepath could be user selected one.

        String FilePath = "/mnt/sdcard/" + "sampleinput.xls";
    
            try {
                if (resultCode == RESULT_OK) {
                   
                    //// Import function goes here
                }
            } catch (Exception ex) {
               
                lbl.setText("Error " + e);
            }
            break;
    }

}

Intent : 选择一个 excel sheet 有输入数据

 bimport.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                Intent fileintent = new Intent(Intent.ACTION_OPEN_DOCUMENT);

                fileintent.addCategory(Intent.CATEGORY_OPENABLE);

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

                    requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                            MY_PERMISSIONS_LOCATION_ACCESS);

                    requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                            MY_PERMISSIONS_READ_EXTERNAL_STORAGE);

                    requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                            MY_PERMISSIONS_WRITE_EXTERNAL_STORAGE);
                }
           
                fileintent.setType("application/vnd.ms-excel");

                try {
                    startActivityForResult(fileintent, importrequestcode);

                    fileintent.addFlags(FLAG_GRANT_READ_URI_PERMISSION);

                    if (Build.VERSION.SDK_INT > 22) {
                        requestPermissions(new String[]{"FLAG_GRANT_READ_URI_PERMISSION"}, 11);

                    }

                } catch (ActivityNotFoundException e) {
                    lbl.setText("No file picker activity.");
                }
            }

        });

    }

获取文件名:

private String getFileName(Uri uri) {

        Cursor mCursor =
                getApplicationContext().getContentResolver().query(uri, null, null, null, null);
        int indexedname = mCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
        mCursor.moveToFirst();
        String filename = mCursor.getString(indexedname);
        mCursor.close();
        return filename;
    }

获取文件路径:

[Checkthislink](

在onActivityResult中调用方法和class:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (data == null)
        return;
        
    switch (requestCode) {
   
        case imrequestcode:
     
         Uri fileuri = data.getData();
         String Nameoffile_selected = getFileName(fileuri);
         String Pathoffile_selected = FileUtils.getPath(this, fileuri);
    
            try {
                if (resultCode == RESULT_OK) {
                   
                    //// Import function goes here
                }
            } catch (Exception ex) {
               
                lbl.setText("Error " + e);
            }
            break;
    }
}