ver texto studio sobreescribir memoria los leer interna guardar guardan escribir donde crear como archivos archivo android file-browser

texto - Android abriendo un archivo con los resultados de ACTION_GET_CONTENT en diferentes Uri''s



leer archivos java en android (1)

Use el código de abajo. Esto funcionará seguro.

public static String getPath(Context context, Uri uri) { final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; // DocumentProvider if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { // ExternalStorageProvider if (isExternalStorageDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; if ("primary".equalsIgnoreCase(type)) { return Environment.getExternalStorageDirectory() + "/" + split[1]; } // TODO handle non-primary volumes } // DownloadsProvider else if (isDownloadsDocument(uri)) { final String id = DocumentsContract.getDocumentId(uri); final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); return getDataColumn(context, contentUri, null, null); } // MediaProvider else if (isMediaDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; Uri contentUri = null; if ("image".equals(type)) { contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; } else if ("video".equals(type)) { contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; } else if ("audio".equals(type)) { contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; } final String selection = "_id=?"; final String[] selectionArgs = new String[] {split[1]}; return getDataColumn(context, contentUri, selection, selectionArgs); } } // MediaStore (and general) else if ("content".equalsIgnoreCase(uri.getScheme())) { // Return the remote address if (isGooglePhotosUri(uri)) return uri.getLastPathSegment(); return getDataColumn(context, uri, null, null); } // File else if ("file".equalsIgnoreCase(uri.getScheme())) { return uri.getPath(); } return null; } public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { Cursor cursor = null; final String column = "_data"; final String[] projection = { column }; try { cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); if (cursor != null && cursor.moveToFirst()) { final int index = cursor.getColumnIndexOrThrow(column); return cursor.getString(index); } } finally { if (cursor != null) cursor.close(); } return null; } public static boolean isExternalStorageDocument(Uri uri) { return "com.android.externalstorage.documents".equals(uri.getAuthority()); } /** * @param uri The Uri to check. * @return Whether the Uri authority is DownloadsProvider. */ public static boolean isDownloadsDocument(Uri uri) { return "com.android.providers.downloads.documents".equals(uri.getAuthority()); } /** * @param uri The Uri to check. * @return Whether the Uri authority is MediaProvider. */ public static boolean isMediaDocument(Uri uri) { return "com.android.providers.media.documents".equals(uri.getAuthority()); } /** * @param uri The Uri to check. * @return Whether the Uri authority is Google Photos. */ public static boolean isGooglePhotosUri(Uri uri) { return "com.google.android.apps.photos.content".equals(uri.getAuthority()); }

Utilice el siguiente código para navegar por el archivo en cualquier formato.

public void browseClick() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("*/*"); intent.addCategory(Intent.CATEGORY_OPENABLE); //intent.putExtra("browseCoa", itemToBrowse); //Intent chooser = Intent.createChooser(intent, "Select a File to Upload"); try { //startActivityForResult(chooser, FILE_SELECT_CODE); startActivityForResult(Intent.createChooser(intent, "Select a File to Upload"),FILE_SELECT_CODE); } catch (Exception ex) { System.out.println("browseClick :"+ex);//android.content.ActivityNotFoundException ex } }

A continuación, obtenga esa ruta de archivo en el onActivityResult como a continuación.

@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == FILE_SELECT_CODE) { if (resultCode == RESULT_OK) { try { Uri uri = data.getData(); if (filesize >= FILE_SIZE_LIMIT) { Toast.makeText(this,"The selected file is too large. Selet a new file with size less than 2mb",Toast.LENGTH_LONG).show(); } else { String mimeType = getContentResolver().getType(uri); if (mimeType == null) { String path = getPath(this, uri); if (path == null) { filename = FilenameUtils.getName(uri.toString()); } else { File file = new File(path); filename = file.getName(); } } else { Uri returnUri = data.getData(); Cursor returnCursor = getContentResolver().query(returnUri, null, null, null, null); int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME); int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE); returnCursor.moveToFirst(); filename = returnCursor.getString(nameIndex); String size = Long.toString(returnCursor.getLong(sizeIndex)); } File fileSave = getExternalFilesDir(null); String sourcePath = getExternalFilesDir(null).toString(); try { copyFileStream(new File(sourcePath + "/" + filename), uri,this); } catch (Exception e) { e.printStackTrace(); } } } catch (Exception e) { e.printStackTrace(); } } } } private void copyFileStream(File dest, Uri uri, Context context) throws IOException { InputStream is = null; OutputStream os = null; try { is = context.getContentResolver().openInputStream(uri); os = new FileOutputStream(dest); byte[] buffer = new byte[1024]; int length; while ((length = is.read(buffer)) > 0) { os.write(buffer, 0, length); } } catch (Exception e) { e.printStackTrace(); } finally { is.close(); os.close(); } }

Después de esto, puede abrir este archivo desde el almacenamiento externo de la aplicación donde guardó el archivo con la acción apropiada.

Estoy intentando abrir archivos usando Intent.ACTION_GET_CONTENT .

Dependiendo de la versión de Android / marca del dispositivo, el navegador de archivos se abre y obtengo los siguientes resultados:

Seleccionando un archivo de Downloads :

content://com.android.providers.downloads.documents/document/446

Seleccionando un archivo de Fotos :

content://media/external/images/media/309

Seleccionando un archivo de FileCommander :

file:///storage/emulated/0/DCIM/Camera/20141027_132114.jpg

Puedo abrir todos estos archivos, excepto cuando intento abrir un archivo desde Downloads, Afbeeldingen Audio , Afbeeldingen (Imágenes)

Es probable que no pueda manejar este tipo de Uri: content://com.android.providers.downloads.documents/document/446

He intentado las siguientes cosas:

  • Intentando abrir el archivo con un archivo nuevo (uri.getPath ()). File.exists () devuelve falso.
  • Intentando abrir / alcanzar el archivo mediante getContext (). GetContentResolver (). OpenInputStream (uri). Resultados en una excepción FileNotFoundException
  • Intentando abrir el archivo con el siguiente código:

    public static String getRealPathFromURI_API19(Context context, Uri uri) { Log.i("uri", uri.getPath()); String filePath = ""; if (uri.getScheme().equals("file")) { return uri.getPath(); } else if (DocumentsContract.isDocumentUri(context, uri)) { String wholeID = DocumentsContract.getDocumentId(uri); Log.i("wholeID", wholeID); // Split at colon, use second item in the array String[] splits = wholeID.split(":"); if (splits.length == 2) { String id = splits[1]; String[] column = {MediaStore.Images.Media.DATA}; // where id is equal to String sel = MediaStore.Images.Media._ID + "=?"; Cursor cursor = context.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(); } } else { filePath = AttachmentUtils.getPath(context, uri); } return filePath; }

¿Qué estoy haciendo mal?

ACTUALIZACIÓN: Me he dado cuenta de que los archivos que se enumeran en la captura de pantalla no existen físicamente en el almacenamiento. El dispositivo que estoy usando es una tableta de la empresa que contiene datos de basura. Mi colega me dijo que este dispositivo una vez estuvo conectado con una cuenta de Google diferente. Estos archivos podrían ser los archivos de la cuenta anterior que ya no están disponibles / accesibles.

Mi propia conclusión al respecto es que me encuentro con un error en Android. Mi informe de error

Actualización 6 de febrero de 2017:

Android prohibió el file:// URI. Por favor considere pensar en ello.

Prohibición de archivo: esquema de Uri El mayor problema de compatibilidad hasta ahora con Android 7.0 es que el esquema de archivo: para los valores de Uri está prohibido, en efecto. Si intenta pasar un archivo: Uri en una Intención que va a otra aplicación, ya sea a través de una faceta adicional o como "datos" de la Intención, se bloqueará con una excepción FileUriExposedException. Se enfrentarán problemas similares con la colocación de archivos: valores de Uri en el portapapeles en ClipData. Esto viene de una edición actualizada de StrictMode. StrictMode.VmPolicy.Builder tiene un método penaltyDeathOnFileUriExposure () que desencadena la detección del archivo: valores de Uri y las excepciones de excepción de FileUriExposedException resultantes. Y, parece que esto está preconfigurado, así como la forma en que StrictMode está preconfigurado para aplicar penaltyDeathOnNetwork () (la fuente de su NetworkOnMainThreadException se bloquea).