Android - Как получить выбранное имя файла из документа

Я запускаю намерение выбора documnets, используя следующий код.

private void showFileChooser() {
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("*/*");
    intent.addCategory(Intent.CATEGORY_OPENABLE);

    try {
        startActivityForResult(
                Intent.createChooser(intent, "Select a File to Upload"), 1);
    } catch (android.content.ActivityNotFoundException ex) {
        // Potentially direct the user to the Market with a Dialog
        Toast.makeText(this, "Please install a File Manager.",
                Toast.LENGTH_SHORT).show();
    }
}

В onActivity результаты, когда я пытаюсь получить путь к файлу, он дает другой номер вместо имени файла.

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
    case 1:
        if (resultCode == RESULT_OK) {
            // Get the Uri of the selected file
            Uri uri = data.getData();
            File myFile = new File(uri.toString());
            String path = myFile.getAbsolutePath();
        }
        break;
    }
    super.onActivityResult(requestCode, resultCode, data);
}

Это значение пути, которое я получаю. "содержание://com.android.providers.downloads.documents/document/1433" Но я хочу настоящее имя файла, например doc1.pdf и т.д. Как его получить?

Ответ 1

Когда вы получаете контент://uri, вам нужно запросить контент-резольвер, а затем захватить отображаемое имя.

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
    case 1:
        if (resultCode == RESULT_OK) {
            // Get the Uri of the selected file
            Uri uri = data.getData();
            String uriString = uri.toString();
            File myFile = new File(uriString);
            String path = myFile.getAbsolutePath();
            String displayName = null;

            if (uriString.startsWith("content://")) {                   
                Cursor cursor = null;
                try {                           
                    cursor = getActivity().getContentResolver().query(uri, null, null, null, null);                         
                    if (cursor != null && cursor.moveToFirst()) {                               
                        displayName = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
                    }
                } finally {
                    cursor.close();
                }
            } else if (uriString.startsWith("file://")) {           
                displayName = myFile.getName();
            }
        }
        break;
    }
    super.onActivityResult(requestCode, resultCode, data);
}

Ответ 2

Вот полное решение:

Передайте свой контекст и объект URI из onActivityResult в следующую функцию, чтобы получить правильный путь:

он задает путь как /storage/emulated/0/APMC Mahuva/Report20-11-2017.pdf (где я выбрал этот файл Report20-11-2017.pdf)

String getFilePath(Context cntx, Uri uri) {
    Cursor cursor = null;
    try {
        String[] arr = { MediaStore.Images.Media.DATA };
        cursor = cntx.getContentResolver().query(uri,  arr, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
}

Ответ 3

Сначала Проверьте, предоставлено ли разрешение для приложения.. Ниже метод используется для проверки разрешения во время выполнения

 public void onClick(View v) {
            //Checks if the permission is Enabled or not...
            if (ContextCompat.checkSelfPermission(thisActivity,
                    Manifest.permission.READ_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(thisActivity,
                        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                        REQUEST_PERMISSION);
            } else {
                Intent galleryIntent = new Intent(Intent.ACTION_PICK,
                        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                startActivityForResult(galleryIntent, USER_IMG_REQUEST);
            }
        }

и ниже метод используется для нахождения имени пути uri файла

private String getRealPathFromUri(Uri uri) {
    String[] projection = {MediaStore.Images.Media.DATA};
    CursorLoader cursorLoader = new CursorLoader(thisActivity, uri, projection, null, null, null);
    Cursor cursor = cursorLoader.loadInBackground();
    int column = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    String result = cursor.getString(column);
    cursor.close();
    return result;
}

и указанный метод можно использовать как

 if (requestCode == USER_IMG_REQUEST && resultCode == RESULT_OK && data != null) {
        Uri path = data.getData();
        try {
            String imagePath = getRealPathFromUri(path);
            File file = new File(imagePath);
            RequestBody reqFile = RequestBody.create(MediaType.parse("image/*"), file);
            MultipartBody.Part imageFile = MultipartBody.Part.createFormData("userImage", file.getName(), reqFile);

Ответ 4

Вы можете попробовать это, я надеюсь, что это поможет u:

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.i("inside", "onActivityResult");
        if(requestCode == FILE_MANAGER_REQUEST_CODE)
        {
            // Check if the user actually selected an image:
            if(resultCode == Activity.RESULT_OK)
            {
                // This gets the URI of the image the user selected:
                Uri selectedFileURI = data.getData();
                File file = new File(getRealPathFromURI(selectedFileURI));



                // Create a new Intent to send to the next Activity:
            }
        }
    }


    private String getRealPathFromURI(Uri contentURI) {
            String result;
            Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);
            if (cursor == null) { // Source is Dropbox or other similar local file path
                result = contentURI.getPath();
            } else { 
                cursor.moveToFirst(); 
                int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
                result = cursor.getString(idx);
                cursor.close();
            }
            return result;
        }