En mi aplicación, el usuario debe seleccionar un archivo de audio que la aplicación maneja. El problema es que para que la aplicación haga lo que quiero que haga con los archivos de audio, necesito que el URI esté en formato de archivo. Cuando uso el reproductor de música nativo de Android para buscar el archivo de audio en la aplicación, el URI es un URI de contenido, que se ve así:
content://media/external/audio/media/710
Sin embargo, usando la popular aplicación de administración de archivos Astro, obtengo lo siguiente:
file:///sdcard/media/audio/ringtones/GetupGetOut.mp3
Este último es mucho más accesible para mí para trabajar, pero, por supuesto, quiero que la aplicación tenga funcionalidad con el archivo de audio que el usuario elija, independientemente del programa que use para navegar por su colección. Entonces mi pregunta es, ¿hay alguna forma de convertir el content://
estilo URI en un file://
URI? De lo contrario, ¿qué me recomendarías para resolver este problema? Aquí está el código que llama al selector, como referencia:
Intent ringIntent = new Intent();
ringIntent.setType("audio/mp3");
ringIntent.setAction(Intent.ACTION_GET_CONTENT);
ringIntent.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(Intent.createChooser(ringIntent, "Select Ringtone"), SELECT_RINGTONE);
Hago lo siguiente con el URI de contenido:
m_ringerPath = m_ringtoneUri.getPath();
File file = new File(m_ringerPath);
Luego haga algunas cosas de FileInputStream con dicho archivo.
Respuestas:
Solo use
getContentResolver().openInputStream(uri)
para obtener unInputStream
de un URI.http://developer.android.com/reference/android/content/ContentResolver.html#openInputStream(android.net.Uri)
fuente
Esta es una vieja respuesta con una forma desaprobada y hacky de superar algunos puntos débiles específicos de resolución de contenido. Tómelo con algunos granos de sal enormes y use la API openInputStream adecuada si es posible.
Puede usar Content Resolver para obtener una
file://
ruta desde elcontent://
URI:fuente
android.provider.MediaStore.Images.ImageColumns.DATA
Siempre se garantiza que la columna "_data" ( ) existe si el esquema lo escontent://
?File
cuando intente omitir ContentResolver. Utilice los métodos de ContentResolver para operar encontent://
uris, este es el enfoque oficial, alentado por los ingenieros de Google.Si tiene un Uri de contenido
content://com.externalstorage...
, puede usar este método para obtener la ruta absoluta de una carpeta o archivo en Android 19 o superior .Puede verificar que cada parte de Uri está usando println. Los valores devueltos para mi tarjeta SD y la memoria principal del dispositivo se enumeran a continuación. Puede acceder y eliminar si el archivo está en la memoria pero no pude eliminar el archivo de la tarjeta SD usando este método, solo leí o abrí la imagen usando esta ruta absoluta. Si ha encontrado una solución para eliminar usando este método, por favor comparta. TARJETA SD
MEMORIA PRINCIPAL
Si desea obtener Uri
file:///
después de usar el caminofuente
Intentar manejar el URI con contenido: // esquema llamando
ContentResolver.query()
no es una buena solución. En HTC Desire con 4.2.2, puede obtener NULL como resultado de la consulta.¿Por qué no utilizar ContentResolver en su lugar? https://stackoverflow.com/a/29141800/3205334
fuente
content://
uri, correspondiente al archivo en su directorio interno privado, no podrá usar esa uri conFile
API en nuevas versiones de Android. ContentResolver está diseñado para superar este tipo de limitaciones de seguridad. Si recibió el uri de ContentResolver, puede esperar que funcione.Las respuestas inspiradas son Jason LaBrun y Darth Raven . Probar enfoques ya respondidos me llevó a la siguiente solución que puede cubrir principalmente casos nulos de cursor y conversión de contenido: // a archivo: //
Para convertir el archivo, lea y escriba el archivo de uri obtenida
Para obtener el uso del nombre de archivo, cubrirá el caso de cursor nulo
Hay una buena opción para convertir de tipo mime a extensión de archivo
Cursor para obtener el nombre del archivo
fuente
Bueno, llego un poco tarde para responder, pero mi código está probado
comprobar esquema de uri:
En la respuesta anterior, convertí la uri del video en una matriz de bytes, pero eso no está relacionado con la pregunta, simplemente copié mi código completo para mostrar el uso de
FileInputStream
yInputStream
ya que ambos funcionan igual en mi código.Usé el contexto variable que es getActivity () en mi Fragmento y en Activity simplemente es ActivityName.this
context=getActivity();
// en Fragmentocontext=ActivityName.this;
// en actividadfuente
byte[] videoBytes;
? La mayoría de las respuestas solo muestran cómo usarInputStream
con una imagen.