如何使用Android新的androidx.media2.widget.VideoView

时间:2018-12-21 18:12:52

标签: java android kotlin android-jetpack androidx

问题

找不到有关androidx.media2.VideoView的信息。 我想从正在使用VideoView1的网址流式传输视频,但是我无法使用VideoView2来实现。

我的研究

他们在文档中描述了这种方法:

setVideoUri 开放乐趣setVideoUri(uri: Uri!, headers: MutableMap<String!, String!>?): Unit 使用特定的标题设置视频URI。

但是这种方法似乎不再可用(我正在使用mediaWidgetVersion 1.0.0-alpha06

3 个答案:

答案 0 :(得分:2)

供以后参考 androidx.media2.widget.VideoView 的简单用法是:

  
      
  1. 根据需要创建 MediaMetadata 。在这里,我只是设置媒体标题
  2.   
  val mediaMetaData = MediaMetadata.Builder()
      .putString(MediaMetadata.METADATA_KEY_TITLE, "media title")
      .build()
  
      
  1. 从任何来源创建 MediaItem 。在这里,我使用url作为来源
  2.   
  val mediaItem = UriMediaItem.Builder(videoUrl.toUri())
      .setMetadata(mediaMetaData) // optional
      .build()
  
      
  1. 通过调用setPlayer
  2. 创建 SessionPlayer 并将其设置为 VideoView   
  val mediaPlayer = MediaPlayer(this)
  with(mediaPlayer) {
    videoView.setPlayer(this)

    setMediaItem(mediaItem)
    // play when ready
    prepare().addListener(
      Runnable { play() },
      Executors.BACKGROUND_EXECUTOR
    )
  }

答案 1 :(得分:0)

您应该使用MediaItem内部构建器来创建UriMediaItem

UriMediaItem yourUriMediaItemHere = new UriMediaItem.Builder(context, uri).build();

然后使用像这样的videoViews setMediaItem方法

videoView.setMediaItem(yourUriMediaItemHere);

答案 2 :(得分:0)

根据此文档: https://developer.android.com/reference/androidx/media2/widget/VideoView

将VideoView与SessionPlayer或MediaController一起使用 对于不需要与MediaSession进行通信的简单用例,应用程序需要创建一个扩展了SessionPlayer(例如MediaPlayer)的播放器实例,并通过调用setPlayer(SessionPlayer)将其链接到此视图。 对于需要MediaSession的更高级的用例(例如,处理媒体按键事件,与其他MediaSession应用程序集成为助手),应用程序需要创建一个附加到MediaSession的MediaController并通过调用setMediaController(MediaController)将其链接到此视图。 / p>

但是有一个非常重要的事情没有从本文档中注意到。

以下是有关如何使用此新package com.custom.ui.base.border; import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.awt.Insets; import javax.swing.border.EmptyBorder; /** * This border for toolbar button component holds group of buttons. Clicking on this, one popup comes that * contains all the options buttons available against this toolbar button. * * @version 1.0.0.1 (Sep 15, 2010) * @author Arindam Roy */ public class ToolbarButtonOptionsBorder extends EmptyBorder { /** * Indicates width of the Down arrow icon width */ private int optionArrowWidth = 7; /** * Creates new instance of ToolbarButtonOptionsBorder */ public ToolbarButtonOptionsBorder() { super(new Insets(4, 4, 4, 8)); } /** * Paints the border for the specified component with the specified position and size. * * @param c the component for which this border is being painted * @param g the paint graphics * @param x the x position of the painted border * @param y the y position of the painted border * @param width the width of the painted border * @param height the height of the painted border */ @Override public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { super.paintBorder(c, g, x, y, width, height); g.setColor(Color.LIGHT_GRAY); int xPoints[] = new int[]{x + width - optionArrowWidth - 1, x + width - 1, x + width - 2 - (optionArrowWidth / 2)}; int yPoints[] = new int[]{y + (height / 2) - 1, y + (height / 2) - 1, y + (height / 2) + 3}; g.fillPolygon(xPoints, yPoints, xPoints.length); g.drawLine(x + width - optionArrowWidth - 2, y + 5, x + width - optionArrowWidth - 2, height - 3); g.setColor(Color.BLACK); xPoints = new int[]{x + width - optionArrowWidth, x + width - 2, x + width - 2 - (optionArrowWidth / 2)}; yPoints = new int[]{y + (height / 2) - 1, y + (height / 2) - 1, y + (height / 2) + 2}; g.fillPolygon(xPoints, yPoints, xPoints.length); } } 的代码段。

VideoView

您必须致电MediaMetadata mediaMetaData = new MediaMetadata.Builder() .putString(MediaMetadata.METADATA_KEY_TITLE, url) .build(); UriMediaItem mediaItem = new UriMediaItem.Builder(Uri.parse(url)).build(); mediaItem.setMetadata(mediaMetaData); MediaPlayer mediaPlayer = new MediaPlayer(getActivity()); mediaPlayer.setMediaItem(mediaItem); mediaPlayer.prepare(); videoView.setPlayer(mediaPlayer); 告诉mediaPlayer.prepare()开始加载。 否则,您会收到MediaPlayer的无用消息。