open - android file chooser
Abra un URI de contenido de archivos de Google Drive después de usar KitKat Storage Access Framework (2)
Estoy usando Storage Access Framework para Android 4.4 y abro el selector de archivos.
Todo funciona, excepto cuando se elige un archivo de Google Drive, solo puedo descubrir cómo abrirlo como una secuencia de entrada, pero me gustaría obtener un objeto java File.
El contenido del uri que se está devolviendo se ve así: content: //com.google.android.apps.docs.storage/document/acc%3D4%3Bdoc%3D2279
Otras preguntas que son similares pero que no tienen una solución funcional que me permita obtener el nombre del archivo, el tamaño del archivo y el contenido:
- Obtenga una ruta real desde URI, Android KitKat nuevo marco de acceso de almacenamiento
- La Galería de Android en KitKat devuelve diferentes Uri para Intención.ACTION_GET_CONTENT
También he buscado en FileChooser de Paul Burke ( https://github.com/iPaulPro/aFileChooser ) y esta es la pregunta más común en la lista del problema.
¿Cómo puedo obtener un archivo de ese contenido uri?
Mi solución actual es escribir un archivo temporal desde un flujo de entrada.
¡Gracias!
De acuerdo. Descubrí que la forma correcta es utilizar el flujo de entrada de las otras publicaciones junto con algunos datos del solucionador de contenido.
Para referencia, aquí están los documentos de Android difíciles de encontrar: https://developer.android.com/training/secure-file-sharing/retrieve-info.html
El código relevante para obtener mimetype, nombre de archivo y tamaño de archivo:
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)));
Y para obtener el contenido del archivo:
getContentResolver().openInputStream(uri)
Espero que esto ayude a alguien más.
este código resolvió mi problema, cuando intenté seleccionar una imagen de Google Drive, la aplicación se bloqueó,
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();
}