Подтвердить что ты не робот

Откройте URI содержимого файла Google Диска после использования KitKat Storage Access Framework

Я использую платформу доступа к хранилищу для Android 4.4 и открываю сборщик файлов.

Все работает, кроме как при выборе файла с Google Диска, я могу только выяснить, как его открыть как входной поток, но я хотел бы получить объект Java файла.

Содержимое uri, которое возвращается, выглядит примерно так: content://com.google.android.apps.docs.storage/document/acc%3D4%3Bdoc%3D2279

Другие вопросы, которые схожи, но не имеют рабочего решения, которое позволяет мне получить имя файла, его размер и содержимое:

Я также рассмотрел Paul Burke FileChooser (https://github.com/iPaulPro/aFileChooser), и это самый распространенный вопрос в списке проблем.

Как я могу получить файл из этого содержимого uri?

Мое текущее обходное решение - выписать временный файл из входного потока.

Спасибо!

4b9b3361

Ответ 1

Ok. Я нашел, что правильным способом является использование входного потока из других сообщений в сочетании с некоторыми данными из contentresolver.

Для справки здесь трудно найти андроидные документы: https://developer.android.com/training/secure-file-sharing/retrieve-info.html

Соответствующий код для получения типа mimetype, имени файла и файла:

Uri returnUri = returnIntent.getData();
String mimeType = getContentResolver().getType(returnUri);
Cursor returnCursor =
        getContentResolver().query(returnUri, null, null, null, null);
int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);
returnCursor.moveToFirst();
TextView nameView = (TextView) findViewById(R.id.filename_text);
TextView sizeView = (TextView) findViewById(R.id.filesize_text);
nameView.setText(returnCursor.getString(nameIndex));
sizeView.setText(Long.toString(returnCursor.getLong(sizeIndex)));

И чтобы получить содержимое файла:

getContentResolver().openInputStream(uri)

Надеюсь, это поможет кому-то еще.

Ответ 2

этот код решил мою проблему, когда я попытался выбрать изображение с диска Google, приложение получило потерю,

 private void setImagePath(Intent data) throws Exception {

        String wholeID="";
        Uri selectedImage = data.getData();
        if(Build.VERSION.SDK_INT<=Build.VERSION_CODES.JELLY_BEAN_MR2){
            wholeID=getUriPreKitkat(selectedImage);
        }else  {
            wholeID = DocumentsContract.getDocumentId(selectedImage);

        }

        // Split at colon, use second item in the array
        Log.i("debug","uri google drive "+wholeID);
        String id = wholeID.split(":")[1];

        String[] column = {MediaStore.Images.Media.DATA};

        // where id is equal to
        String sel = MediaStore.Images.Media._ID + "=?";

        Cursor cursor = getActivity().getContentResolver().
                query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                        column, sel, new String[]{id}, null);


        int columnIndex = cursor.getColumnIndex(column[0]);

        if (cursor.moveToFirst()) {
            filePath = cursor.getString(columnIndex);
        }
        cursor.close();

    }