Android MediaStore вставитьВидео - PullRequest
6 голосов
/ 22 января 2010

Так что наше приложение имеет возможность сделать снимок или видео.Если пользователь делает снимок, мы можем использовать функцию MediaStore.Images.Media.insertImage, чтобы добавить новое изображение (через путь к файлу) в галерею телефона и сгенерировать URI типа content: //.Есть ли похожий процесс для захваченного видео, учитывая, что у нас есть только его путь к файлу?

Ответы [ 5 ]

10 голосов
/ 13 февраля 2013

Вот простое «решение на основе одного файла»:

Всякий раз, когда вы добавляете файл, сообщите MediaStore Content Provider об этом, используя

sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(imageAdded)));

Главное преимущество: работа с любым типом пантомимы, поддерживаемым MediaStore

Всякий раз, когда вы удаляете файл, сообщите MediaStore Content Provider об этом, используя

getContentResolver().delete(uri, null, null)
5 голосов
/ 31 июля 2012

Если ваше приложение генерирует новое видео, и вы просто хотите предоставить MediaStore некоторые метаданные для него, вы можете использовать эту функцию:

public Uri addVideo(File videoFile) {
    ContentValues values = new ContentValues(3);
    values.put(MediaStore.Video.Media.TITLE, "My video title");
    values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4");
    values.put(MediaStore.Video.Media.DATA, videoFile.getAbsolutePath());
    return getContentResolver().insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);
}

РЕДАКТИРОВАТЬ : Начиная с Android 4.4 (KitKat), этот метод больше не работает.

5 голосов
/ 10 февраля 2010

Мне тоже интересно, не могли бы вы найти решение?

Редактировать: решение RTFM. На основе главы «Поставщики контента» приведен мой работающий код:

        // Save the name and description of a video in a ContentValues map.  
        ContentValues values = new ContentValues(2);
        values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4");
        // values.put(MediaStore.Video.Media.DATA, f.getAbsolutePath()); 

        // Add a new record (identified by uri) without the video, but with the values just set.
        Uri uri = getContentResolver().insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);

        // Now get a handle to the file for that record, and save the data into it.
        try {
            InputStream is = new FileInputStream(f);
            OutputStream os = getContentResolver().openOutputStream(uri);
            byte[] buffer = new byte[4096]; // tweaking this number may increase performance
            int len;
            while ((len = is.read(buffer)) != -1){
                os.write(buffer, 0, len);
            }
            os.flush();
            is.close();
            os.close();
        } catch (Exception e) {
            Log.e(TAG, "exception while writing video: ", e);
        } 

        sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));
4 голосов
/ 20 апреля 2015

Мне не удалось заставить работать Intent.ACTION_MEDIA_SCANNER_SCAN_FILE трансляцию для меня по API 21 (Lollipop), но MediaScannerConnection работает, например ::10000 *

        MediaScannerConnection.scanFile(
                context, new String[] { path }, null,
                new MediaScannerConnection.OnScanCompletedListener() {
                    public void onScanCompleted(String path, Uri uri) {
                        Log.d(TAG, "Finished scanning " + path + " New row: " + uri);
                    }
                } );
1 голос
/ 13 марта 2014

Попробуйте этот код. Кажется, это работает для меня.

 filePath = myfile.getAbsolutePath();
 ContentValues values = new ContentValues();
 values.put(MediaStore.Video.Media.DATA, filePath);
 return context.getContentResolver().insert(
                    MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);

Пример filePath -

/storage/emulated/0/DCIM/Camera/VID_20140313_114321.mp4
...