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:
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.