将缩略图设置为VideoView的Intent

时间:2018-01-03 09:13:11

标签: android video android-videoview mediacontroller

我必须在Android的某个屏幕上播放视频,而我正在使用Video View意图。视频播放但屏幕启动时没有缩略图。

我的代码就像这样

@OnClick(R.id.icon_play)
    protected void playVideo(){
        String videoUrl="https://someUrl/Video/v07.mp4";
        if(!videoUrl.isEmpty()) {
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(videoUrl));
            intent.setDataAndType(Uri.parse(videoUrl), "video/mp4");
            startActivity(intent);
        }

    }

通过缩略图,我的意思是当屏幕启动时,每个视频都应该有自己的图像。 (像YouTube一样)

我尝试seekTo()附加缩略图,但它没有用。 请帮忙。感谢。

3 个答案:

答案 0 :(得分:2)

我使用MediaMetaDataRetriever解决了这个问题。

代码就是这样 -

public static Bitmap retriveVideoFrameFromVideo(String videoPath)
            throws Throwable
    {
        Bitmap bitmap = null;
        MediaMetadataRetriever mediaMetadataRetriever = null;
        try
        {
            mediaMetadataRetriever = new MediaMetadataRetriever();
            if (Build.VERSION.SDK_INT >= 14)
                mediaMetadataRetriever.setDataSource(videoPath, new HashMap<String, String>());
            else
                mediaMetadataRetriever.setDataSource(videoPath);
            //   mediaMetadataRetriever.setDataSource(videoPath);
            bitmap = mediaMetadataRetriever.getFrameAtTime(-1,MediaMetadataRetriever.OPTION_CLOSEST);
        }
        catch (Exception e)
        {
            e.printStackTrace();
            throw new Throwable(
                    "Exception in retriveVideoFrameFromVideo(String videoPath)"
                            + e.getMessage());

        }
        finally
        {
            if (mediaMetadataRetriever != null)
            {
                mediaMetadataRetriever.release();
            }
        }
        return bitmap;
    }

请注意:由于我的视频链接采用服务器网址的形式,因此当视频网址通过时,createThumnailUtils会返回null。

当视频来自本地存储时,以下代码可以正常工作。

Bitmap thumbnail = ThumbnailUtils.createVideoThumbnail("URL", MediaStore.Images.Thumbnails.MINI_KIND);

BitmapDrawable bitmapD = new BitmapDrawable(thumbnail);
VideoView.setBackground(Drawable bitmapD);

希望这有助于某人!!

答案 1 :(得分:0)

刚看了另一个例子。不是100%确定它是否会起作用但值得一试。

Bitmap thumbnail = ThumbnailUtils.createVideoThumbnail("URL", MediaStore.Images.Thumbnails.MINI_KIND);

BitmapDrawable bitmapD = new BitmapDrawable(thumbnail);
VideoView.setBackground(Drawable bitmapD);

请注意,我已经通过电话写了这个,因此可能存在拼写错误。 让我知道这是否有效或者您是否找到了另一种选择

答案 2 :(得分:-1)

这可以用于我在视频播放器列表视图中使用此方法制作视频缩略图...

     Cursor cursor = mContext.getContentResolver().query(
            MediaStore.Video.Media.EXTERNAL_CONTENT_URI, proj,
            MediaStore.Video.Media.DISPLAY_NAME + "=?",
            new String[]{localItem._display_name}, null);
    cursor.moveToFirst();
    long ids = cursor.getLong(cursor
            .getColumnIndex(MediaStore.Video.Media._ID));

    ContentResolver crThumb = mContext.getContentResolver();
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = 1;
    Bitmap curThumb = MediaStore.Video.Thumbnails.getThumbnail(
            crThumb, ids, MediaStore.Video.Thumbnails.MICRO_KIND,
            options);
    itemHolder.thumbImage.setImageBitmap(curThumb);
    curThumb = null;
    cursor.close();

尝试这种方式可能会有所帮助

上面的ans现已弃用。 快速解决方案的新更新答案 我们只需要提供视频数据路径

    Bitmap bmThumbnail;
    bmThumbnail = ThumbnailUtils.createVideoThumbnail(arraylist.get(i)._data, MediaStore.Video.Thumbnails.MICRO_KIND);
    itemHolder.thumbImage.setImageBitmap(bmThumbnail);

其中arraylist.get(i)._ data =&gt;视频路径。

最好的方法是使用Glide或任何其他图片提供异步库来平滑滚动列表视图。