Получить имя выбранного пользователем файла и путь независимо от его местоположения [во внутренней или внешней памяти] в Android? - PullRequest
0 голосов
/ 05 августа 2020

Вместо жестко запрограммированного места хранения в приведенном ниже коде я хотел бы получить [имя и путь] любой выбранной пользователем таблицы Excel для операции импорта данных. Обнаружено, что getExternalStorageDirectory устарела, не знаю, как выполнить требование для доступа к Excelfile как из внутреннего / внешнего хранилища Android.

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 с входными данными

 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.");
                }
            }

        });

    }

1 Ответ

0 голосов
/ 06 августа 2020

Чтобы получить имя файла:

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](https://stackoverflow.com/questions/13209494/how-to-get-the-full-file-path-from-uri/55469368#55469368)

Вызовите метод и класс в onActivityResult:

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

...