android video android-contentresolver mediastore

android - Insertando un video en MediaStore



android-contentresolver (1)

Lo que obtienes 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. Aquí se puede encontrar más información sobre, donde puede ver, que desde la API 19 (KitKat), el acceso a los Media ha cambiado.

Al buscar en el código fuente de Android, podría ver una base de datos de esquema de video y columnas . VideoColumns extiende desde MediaColumns , que tiene la columna:

MediaStore.MediaColumns.DATA

descrito como:

Ruta al archivo en disco.

Así que debes obtener el verdadero Uri del público Uri .

Para ejecutar esto el código:

getDataColumn(context, uri, null, null);

donde uri es tu Uri público 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 proviene de aFileChooser y la función getPath

Estoy tratando de 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é fue insertar un registro en MediaStore.Video.Media.EXTERNAL_CONTENT_URI y luego copiar el archivo en el destino, como se muestra a continuación:

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 la forma de content://media/external/video/media/{id} , lo que parece correcto.

Pero entonces cuando cr.openOutputStream(uri); se ejerce, se lanza una FileNotFoundException .

Este último bit es similar a lo que se hace para Images.Media.insertImage mirando su código fuente.

Por cierto, tengo permiso WRITE_EXTERNAL_STORAGE . Además, estoy probando en 4.3 y 4.4.