как получить путь к файлу из средства выбора файлов после выбора файла из хранилища файлов - PullRequest
1 голос
/ 03 октября 2019

Я пытаюсь создать личное приложение для чата, в котором есть кнопка. При нажатии на эту кнопку становится видимым фрейм, в котором есть кнопки для выбора кликов. Когда кнопка изображения нажата, она создает действие выбора после выбора файла, который я сохранил в imagefile Uri.

Но когда я пытаюсь получить путь к файлу, используя метод data.getdata().getpath(), он выдает doument/236 в качестве вывода, но не дает фактического пути к файлу. Когда я пытаюсь использовать fileutlis для получения пути, он говорит: «не удается разрешить fileutils». Пожалуйста, помогите мне, чтобы я мог получить путь к моему файлу.

imagesend.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        checker = "image";
        Intent imageIntent = new Intent();
        imageIntent.setAction(Intent.ACTION_GET_CONTENT);
        imageIntent.setType("image/*");
        startActivityForResult(Intent.createChooser(imageIntent,"Select Image"),438);
    }
});

 protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == 438 && resultCode == RESULT_OK && data!=null && data.getData()!=null){
        loadingBar.setTitle("Sending Message");
        loadingBar.setMessage("Please wait...");
        loadingBar.setCanceledOnTouchOutside(false);
        loadingBar.show();

        imagefile = data.getData();

        String filepath = data.getData().getPath();

        if(checker.equals("pdf")){
            pdfFilemessage();
        }else if(checker.equals("image")){
            //imagefilemessage();
            Toast.makeText(personalChat.this,filepath,Toast.LENGTH_SHORT).show();
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 03 октября 2019

Эта строка возвращает Uri файла.

imagefile = data.getData();

Что вам нужно сделать, это:

  public String getRealPathFromURI(Uri contentUri) {
        String[] proj = {
            MediaStore.Audio.Media.DATA
        };
        Cursor cursor = managedQuery(contentUri, proj, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }

Добавьте это к своему коду.

String filePath = this.getRealPathFromURI(imagefile);

См. Это: https://stackoverflow.com/a/13209514

0 голосов
/ 17 октября 2019

С Android 10 вы по умолчанию не сможете получить доступ к файлу напрямую по пути, так как Google заставляет людей использовать Storage Access Framework или MediaStore для доступа к файлам.

С Android 11 их планчтобы сделать это единственным способом доступа к файлам.

Подробнее см. https://developer.android.com/training/data-storage/files/external-scoped.

Вам потребуется использовать ContentResolver#openFileDescriptor(Uri, String) и ParcelFileDescriptor#getFileDescriptor(), чтобы получить что-то пригодное для использования

например,

ParcelFileDescriptor pfd =
                    this.getContentResolver().
                            openFileDescriptor(Uri, "r");

            FileInputStream fileInputStream =
                    new FileInputStream(
                            pfd.getFileDescriptor());


Если вы хотите получить другую информацию о файле, вы можете сделать это с помощью запроса contentResolver по URI для DISPLAY_NAME или MIME_TYPE для типа файла.

например,

// useful name to display to user
  Cursor cursor = this.getContentResolver()
    .query(Uri, new String[] { MediaStore.Files.FileColumns.DISPLAY_NAME},
    null, null, null);

    cursor.moveToFirst();
    filename = cursor.getString(0);
    cursor.close();
0 голосов
/ 03 октября 2019

Вы можете попробовать это:

Uri fileUri = intent.getData();

Теперь из этого вы можете использовать приведенный ниже файл gist для генерации пути к файлу из URI

https://gist.github.com/tatocaster/32aad15f6e0c50311626

...