Android: как получить миниатюру видеофайла файла, который является приватным для вашего приложения?

Вопрос:

Как получить миниатюру видео для частного приложения? В частности, есть способ извлечь видео кадры из файла .mpeg напрямую?

История:

  • Мое приложение включает камеру, которая может записывать видео.
  • По соображениям продукта видеофайл сначала создается и записывается в приватном режиме в личном каталоге приложений, что делает его приватным для приложения. Это делается с помощью: Context#openFileOutput(fileName, Context.MODE_PRIVATE) - типичный путь к файлу выглядит следующим образом: /data/data/[package.name]/files/[fileName].mp4 - FYI Я уже пробовал использовать Context.MODE_WORLD_READABLE вместо этого из Context.MODE_PRIVATE, но это не помогло.
  • Несмотря на то, что видео может в конечном итоге оказаться во внешнем хранилище (перемещая файл на Environment#getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES)), миниатюра должна отображаться во время видео находится в частном хранилище приложений.
  • Кажется, что ThumbnailUtils.createVideoThumbnail(String, int) отлично работает для файла после его перемещения в общий каталог (независимо от его добавления в MediaStore), но молча завершает работу (возвращает null), когда файл находится во внутреннем хранилище.

    • Примечание. До тех пор, пока видеофайл находится в частном хранилище приложений, он не добавляется в MediaStore (поставщик изображений/видеоконтента на ленте галереи устройства). Только после того, как видео будет перемещено во внешнее хранилище, я добавляю его в MediaStore. Это решение, связанное с продуктом, которое я не могу совершить кругосветным путем; если нет способа добавить видео в медиа-магазин, не видя его в других приложениях... Интересно, можно ли добавить в хранилище мультимедиа видео в приложении-частном хранилище и останется частным приложением, но получить все бесплатные "услуги" "предоставленный медиа-магазином, например, создание миниатюр.

Ответы

Ответ 1

Большинство медиа-API - это просто связующий клиент медиасервера, который работает в своем собственном процессе. Вы можете попытаться сделать файл общедоступным.

Ответ 3

Вы пробовали с помощью нижеприведенного API,

MediaMetadataRetriever:: getFrameAtTime(), обратитесь к Android-разработчик-страница-MediaMetadataRetriever

пример кода:

MediaMetadataRetriever retriever = new MediaMetadataRetriever();
try {
retriever.setDataSource(filePath);
bitmap = retriever.getFrameAtTime(0, MediaMetadataRetriever.OPTION_CLOSEST);
} catch (IllegalArgumentException ex) {
// Assume this is a corrupt video file
} catch (RuntimeException ex) {
// Assume this is a corrupt video file. }

Вышеприведенная часть кода работала для меня!! но мой файл доступен в общих папках.

Ответ 4

Это работает на Gingerbread и up:

try {
    Uri location = Uri.fromFile(context.getFileStreamPath(filePath));
    MediaMetadataRetriever media = new MediaMetadataRetriever();
    ParcelFileDescriptor parcel = ParcelFileDescriptor.open(new File(location.getPath()),ParcelFileDescriptor.MODE_READ_ONLY);
    media.setDataSource(parcel.getFileDescriptor());
    Bitmap thumb = media.getFrameAtTime(0 , MediaMetadataRetriever.OPTION_CLOSEST );
    thumbnail.setImageBitmap(thumb);
} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}