web-dev-qa-db-fra.com

Ouvrez un URI de contenu de fichier Google Drive après avoir utilisé KitKat Storage Access Framework

J'utilise Storage Access Framework pour Android 4.4 et ouvre le sélecteur de fichiers.

Tout fonctionne, sauf lorsque vous choisissez un fichier dans Google Drive. Je ne peux que comprendre comment l'ouvrir en tant que flux d'entrée, mais j'aimerais obtenir un objet Fichier Java.

Le contenu de l'URI renvoyé ressemble à ceci: content: //com.google.Android.apps.docs.storage/document/acc%3D4%3Bdoc%3D2279.

D'autres questions similaires, mais ne disposant pas d'une solution efficace, me permettent d'obtenir le nom du fichier, sa taille et son contenu:

J'ai également examiné FileChooser de Paul Burke ( https://github.com/iPaulPro/aFileChooser ) et c'est la question la plus courante de la liste du problème.

Comment puis-je obtenir un fichier à partir de ce contenu uri?

Ma solution actuelle consiste à écrire un fichier temporaire à partir d'un flux d'entrée.

Merci!

21
Keith Entzeroth

D'accord. J'ai trouvé que le bon moyen consiste à utiliser le flux d'entrée des autres publications en conjonction avec certaines données du contentresolver.

Pour référence, voici les documents Android difficiles à trouver: https://developer.Android.com/training/secure-file-sharing/retrieve-info.html

Le code approprié pour obtenir le type MIME, le nom du fichier et la taille du fichier:

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

Et pour obtenir le contenu du fichier:

getContentResolver().openInputStream(uri)

J'espère que ceci aide quelqu'un d'autre.

33
Keith Entzeroth

ce code a résolu mon problème, lorsque j'ai essayé de sélectionner l'image de google drive, l'application s'est écrasée, 

 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();

    }
0
Adeeb karim