Inserción de un vídeo en MediaStore
Estoy intentando insertar un video en el MediaStore
, de la misma manera que es posible almacenar una imagen usando este método:
MediaStore.Images.Media.insertImage(getContentResolver(), imagePath, null, null)
Como no hay un método similar en MediaStore.Video.Media
, lo que intenté hacer fue insertar un registro en MediaStore.Video.Media.EXTERNAL_CONTENT_URI
y luego copiar el archivo al destino, como se muestra a continuación:
- ¿Por qué mi videoview no está reproduciendo?
- Android :: VideoView dentro de un ScrollView
- PhoneGap Android - Reproducción de vídeos locales
- ANDROID: ¿Cómo puedo descargar un archivo de vídeo a una tarjeta SD?
- Edición de metadatos de un archivo de vídeo en Android
ContentValues values = new ContentValues(); values.put(MediaStore.Video.Media.TITLE, "Title1"); values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4"); values.put(MediaStore.Video.Media.DATA, videoPath); Uri uri = cr.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values); try { OutputStream os = cr.openOutputStream(uri); ... ... } (FileNotFoundException e) { cr.delete(uri, null, null); }
El uri
devuelto non-null
es non-null
en forma de content://media/external/video/media/{id}
, lo que parece correcto.
Pero entonces cuando cr.openOutputStream(uri);
Se ejecuta, se genera una FileNotFoundException
.
Este último bit es similar a lo que se hace para Images.Media.insertImage mirando su código fuente.
Por cierto, tengo el permiso WRITE_EXTERNAL_STORAGE
. Además, estoy probando en 4.3 y 4.4.
- Detectar la máxima resolución de vídeo compatible con un dispositivo móvil en un sitio web que responda
- ¿Cómo puedo obtener los datos de ubicación de un video en Android?
- Marcas de tiempo de presentación incorrectas al buscar hacia atrás a través de vídeo MP4
- Los archivos de video locales no se reproducirán en la aplicación para Android de Cordova
- Integración de VLC o cualquier otro reproductor de video de terceros en la aplicación para Android
- ¿Cómo obtener vídeo de la intención de la cámara y guardarlo en un directorio?
- Reproducción de vídeo desde el directorio caché de la aplicación
- Decodificación h264 ByteStream en Android
Lo que se obtiene de este pedazo de código:
ContentValues values = new ContentValues(); values.put(MediaStore.Video.Media.TITLE, "Title1"); values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4"); values.put(MediaStore.Video.Media.DATA, videoPath); Uri uri = cr.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);
Es un Uri
público. Más información sobre se puede encontrar aquí , donde se puede ver, que desde la API 19 (KitKat) el acceso a los Media
de Media
ha cambiado.
Al mirar en el código fuente de Android se puede ver un esquema de vídeo de base de datos y columnas . VideoColumns
extiende desde MediaColumns
, que tiene la columna:
MediaStore.MediaColumns.DATA
descrito como:
Ruta de acceso al archivo en disco.
Así que debes conseguir el verdadero Uri
del público Uri
.
Para poder ejecutar el código:
getDataColumn(context, uri, null, null);
Donde uri
es tu Uri
pública y la función getDataColumn
parece a:
public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { Cursor cursor = null; final String column = MediaStore.MediaColumns.DATA; final String[] projection = { column }; try { cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); if (cursor != null && cursor.moveToFirst()) { final int column_index = cursor.getColumnIndexOrThrow(column); return cursor.getString(column_index); } } finally { if (cursor != null) cursor.close(); } return null; }
Este código viene de aFileChooser y la función getPath
- Firebase Cloud Messaging colapse_key no se ha recibido (tasa limitada?)
- Actividad SingleTask, pero abierta a través de dos aplicaciones diferentes