Cómo obtener la ruta completa del archivo desde URI
Me gustaría obtener la ruta completa del archivo, desde un URI. El URI no es una imagen, pero es un archivo de música, pero si lo hago como la solución MediaStore, no funcionará si el usuario de la aplicación selecciona, por ejemplo, Astro como navegador, en lugar de Reproductor de música. ¿Cómo puedo solucionar esto?
- ¿Por qué ImageView.setImageURI () funcionaría en Android 2.2 pero no en 2.1?
- ¿Por qué Android tiene su propia implementación de URI y no utiliza la implementación de Java por defecto?
- ContentObserver en el contenido: // sms / in 1.6+?
- Convertir una ruta de acceso de archivo a Uri en Android
- ¿Cómo puedo transformar un Bitmap en un Uri?
- Pausa de envío al marcador
- ¿El método getoutputmediafileuri no es accesible?
- Android Cómo obtener información de ID de una sola canción desde un URI conocido
- Poner una imagen grande en un ImageView no funciona
- CursorLoader, obtiene URI para la base de datos local
- ¿Qué hay de malo en esta URL URI? IllegalArgumentException, Caracteres no válidos
- ¿por qué java.net.UnknownHostException: Host no está resuelto: webservername.com:80?
- ¿Existe un esquema URI universal para la aplicación de Facebook, que funciona en todos los dispositivos móviles?
Utilizar:
String path = yourAndroidURI.uri.getPath() // "file:///mnt/sdcard/FileName.mp3" File file = new File(new URI(path));
o
String path = yourAndroidURI.uri.toString() // "/mnt/sdcard/FileName.mp3" File file = new File(new URI(path));
Prueba esto.
public String getRealPathFromURI(Uri contentUri) { String[] proj = { MediaStore.Audio.Media.DATA }; Cursor cursor = managedQuery(contentUri, proj, null, null, null); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA); cursor.moveToFirst(); return cursor.getString(column_index); }
Puede utilizar get Camino de archivo desde diferentes versiones de SDK
Utilice RealPathUtils para ello
public class RealPathUtils { @SuppressLint("NewApi") public static String getRealPathFromURI_API19(Context context, Uri uri){ String filePath = ""; String wholeID = DocumentsContract.getDocumentId(uri); // Split at colon, use second item in the array String id = wholeID.split(":")[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(); return filePath; } @SuppressLint("NewApi") public static String getRealPathFromURI_API11to18(Context context, Uri contentUri) { String[] proj = { MediaStore.Images.Media.DATA }; String result = null; CursorLoader cursorLoader = new CursorLoader( context, contentUri, proj, null, null, null); Cursor cursor = cursorLoader.loadInBackground(); if(cursor != null){ int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); result = cursor.getString(column_index); } return result; } public static String getRealPathFromURI_BelowAPI11(Context context, Uri contentUri){ String[] proj = { MediaStore.Images.Media.DATA }; Cursor cursor = context.getContentResolver().query(contentUri, proj, null, null, null); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); return cursor.getString(column_index); } }
** Ahora obtenga el archivo Path from URI **
String path = null; if (Build.VERSION.SDK_INT < 11) path = RealPathUtils.getRealPathFromURI_BelowAPI11(MainActivity.this, uri); // SDK >= 11 && SDK < 19 else if (Build.VERSION.SDK_INT < 19) path = RealPathUtils.getRealPathFromURI_API11to18(MainActivity.this, uri); // SDK > 19 (Android 4.4) else path = RealPathUtils.getRealPathFromURI_API19(MainActivity.this, uri); Log.d(TAG, "File Path: " + path); // Get the file instance File file = new File(path);
Utilice la clase PathUtil para obtener la ruta desde URI (Probado y funcionando)
import android.annotation.SuppressLint; import android.content.ContentUris; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.os.Build; import android.os.Environment; import android.provider.DocumentsContract; import android.provider.MediaStore; import java.net.URISyntaxException; /** * Created by Aki on 1/7/2017. */ public class PathUtil { /* * Gets the file path of the given Uri. */ @SuppressLint("NewApi") public static String getPath(Context context, Uri uri) throws URISyntaxException { final boolean needToCheckUri = Build.VERSION.SDK_INT >= 19; String selection = null; String[] selectionArgs = null; // Uri is different in versions after KITKAT (Android 4.4), we need to // deal with different Uris. if (needToCheckUri && DocumentsContract.isDocumentUri(context.getApplicationContext(), uri)) { if (isExternalStorageDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); return Environment.getExternalStorageDirectory() + "/" + split[1]; } else if (isDownloadsDocument(uri)) { final String id = DocumentsContract.getDocumentId(uri); uri = ContentUris.withAppendedId( Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); } else if (isMediaDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; if ("image".equals(type)) { uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; } else if ("video".equals(type)) { uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; } else if ("audio".equals(type)) { uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; } selection = "_id=?"; selectionArgs = new String[]{ split[1] }; } } if ("content".equalsIgnoreCase(uri.getScheme())) { String[] projection = { MediaStore.Images.Media.DATA }; Cursor cursor = null; try { cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); if (cursor.moveToFirst()) { return cursor.getString(column_index); } } catch (Exception e) { } } else if ("file".equalsIgnoreCase(uri.getScheme())) { return uri.getPath(); } return null; } /** * @param uri The Uri to check. * @return Whether the Uri authority is ExternalStorageProvider. */ 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()); } }
String uri_path = "file:///mnt/sdcard/FileName.mp3"; File f = new removeUriFromPath(uri_path)); public static String removeUriFromPath(String uri) { return uri.substring(7, uri.length()); }
- ¿Cómo implementar la función "Enviar comentarios" en Android?
- Establecer el margen de arrastre para el Cajón de navegación Android