subir studio images documentos descargar archivos android android-intent android-file

studio - image firebase android



Android-Cómo obtener el nombre del archivo seleccionado del documento (4)

Estoy lanzando la intención de seleccionar documnets usando el siguiente código.

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

En los resultados de onActivity cuando intento obtener la ruta del archivo, está dando otro número en lugar del nombre del archivo.

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

Ese valor de camino que estoy recibiendo de esta manera. "content: //com.android.providers.downloads.documents/document/1433" Pero quiero un nombre de archivo real como doc1.pdf, etc. ¿Cómo obtenerlo?


Aquí está la solución completa:

Pase su contexto y el objeto URI de onActivityResult a la función de abajo para obtener la ruta correcta:

indica la ruta como /storage/emulated/0/APMC Mahuva/Report20-11-2017.pdf (donde seleccioné este archivo /storage/emulated/0/APMC Mahuva/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(); } } }


Cuando obtenga un contenido: // uri, deberá consultar a un resolutor de contenido y luego tomar el nombre para mostrar.

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


Primero verifique si se ha otorgado el permiso para la Aplicación. El método que se muestra a continuación se usa para verificar el permiso en tiempo de ejecución "

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

y el método de abajo se usa para encontrar el nombre de ruta uri del archivo

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

y el método anterior se puede utilizar como

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


Puedes probar esto, espero que te ayude:

@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; }