Я пытаюсь добавить видеофайл в провайдер медиа-контента. Когда я это делаю, видео вставляется, но что-то не так с его путем к файлу. Видео отображается в Галерее, но если вы пытаетесь воспроизвести его из галереи, выдается сообщение об ошибке «Не удается воспроизвести контент». Файл является копией файла, который уже был в галерее, и оригинальный файл воспроизводится очень хорошо.
То есть:
- вызвать намерение записать видео с камеры (которая уже вставит его в провайдер медиа-контента
- скопировать видеофайл в новый путь (это работает)
- попробуйте также вставить скопированный файл (конечный файл) в провайдер медиа-контента
Как уже упоминалось, видео отображается в галерее (дважды: оригинальное видео в папке DCIM плюс скопированное видео), но копия не может быть воспроизведена.
Вот код. Я не пишу это сам, на самом деле это приложение ODK Collect, и оригинальное приложение ODK Collect (до моей модификации) тоже не работает:
//binaryuri comes from recording a video with the Camera component as an intent
String binaryPath = getPathFromUri((Uri) binaryuri);
String extension = binaryPath.substring(binaryPath.lastIndexOf("."));
String destVideoPath = mInstanceFolder + "/" + System.currentTimeMillis() + extension;
File source = new File(binaryPath);
File newVideo = new File(destVideoPath);
//this simply copies the file into a new location, and it works fine:
FileUtils.copyFile(source, newVideo);
if (newVideo.exists()) {
// Add the copy to the content provier
ContentValues values = new ContentValues(6);
values.put(Video.Media.TITLE, newVideo.getName());
values.put(Video.Media.DISPLAY_NAME, newVideo.getName());
values.put(Video.Media.DATE_ADDED, System.currentTimeMillis());
values.put(Video.Media.DATA, newVideo.getAbsolutePath());
Log.d(t,"Inserting VIDEO: data: "+values.getAsString(Video.Media.DATA));
Uri VideoURI =
getContext().getContentResolver().insert(Video.Media.EXTERNAL_CONTENT_URI, values);
Log.i(t, "Inserting VIDEO returned uri = " + VideoURI.toString());
// ** THIS PART I ADDED FOR DEBUGGING PURPOSES ONLY **
// check: (for debug only)
Cursor c=getContext().getContentResolver().query(VideoURI, null, null, null, null);
if (c.moveToFirst()) {
Log.i(t,"The data path of the inserted video is "+c.getString(c.getColumnIndex(Video.Media.DATA)));
}
// check: (for debug only)
c=getContext().getContentResolver().query(Video.Media.EXTERNAL_CONTENT_URI, null,Video.Media.DATA +" = '"+newVideo.getAbsolutePath()+"'", null, null);
if (c.moveToFirst()) {
Log.d(t,"Double checked: video exists in media content provider");
}
else {
Log.d(t,"Can't find the newly inserted video by file path");
}
} else {
Log.e(t, "Inserting Video file FAILED");
}
Это приводит к следующему выводу в журнале:
02-18 18: 14: 54.888 D / MediaWidget (12752): вставка ВИДЕО: данные:
/ mnt / sdcard / megafone / instances / Matteo2 New
York_2012-02-18_18-14-37 / 1329585294726.3gp 02-18 18: 14: 54.908
I / MediaWidget (12752): вставка VIDEO вернула uri =
контент: // медиа / внешний / видео / медиа / 5 02-18 18: 14: 54.918
I / MediaWidget (12752): путь к данным вставленного видео
/ mnt / sdcard / megafone / instances / Matteo2 New
York_2012-02-18_18-14-37 / 1329585294726.3gp 02-18 18: 14: 54.928
D / MediaWidget (12752): не удается найти недавно вставленное видео по пути к файлу
Это сводит меня с ума. Сразу после вставки файла я запрашиваю контент-провайдера и проверяю его путь к файлу, и это фактически то же значение, которое я ему дал. Однако сразу после этого я ищу элемент в базе данных с этим значением для поля DATA, и видео не найдено (и запрос в порядке: я делаю то же самое с изображениями, и он работает).
Есть идеи, почему вставленное видео повреждено и как это исправить?