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:

 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.

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

  • MediaPlayer no puede procesar en TextureView después de renderizar imágenes
  • Subir vídeo en twitter
  • Vídeo remoto Android con Titanio
  • Android: streaming de video por servidor HTTPS local: certificado SSL rechazado
  • Video vía phonegap en android
  • Reproducción de vídeo mediante la clase MediaPlayer
  • Android: graba vídeo en la misma orientación independientemente de la orientación del dispositivo
  • Vídeo inverso en android
  • Reproducción de vídeo en android directamente desde el servidor
  • Android muestra flujo de vídeo en MediaPlayer y codifica con MediaCodec
  • Cómo incrustar VLC media player en mi aplicación para Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.