Android: проблема с добавлением видеофайла поставщику медиа-контента - PullRequest
1 голос
/ 18 февраля 2012

Я пытаюсь добавить видеофайл в провайдер медиа-контента. Когда я это делаю, видео вставляется, но что-то не так с его путем к файлу. Видео отображается в Галерее, но если вы пытаетесь воспроизвести его из галереи, выдается сообщение об ошибке «Не удается воспроизвести контент». Файл является копией файла, который уже был в галерее, и оригинальный файл воспроизводится очень хорошо.

То есть:

  • вызвать намерение записать видео с камеры (которая уже вставит его в провайдер медиа-контента
  • скопировать видеофайл в новый путь (это работает)
  • попробуйте также вставить скопированный файл (конечный файл) в провайдер медиа-контента

Как уже упоминалось, видео отображается в галерее (дважды: оригинальное видео в папке 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, и видео не найдено (и запрос в порядке: я делаю то же самое с изображениями, и он работает).

Есть идеи, почему вставленное видео повреждено и как это исправить?

...