9

我们正在开发 YouTube 播放器并使用 IFrame API。除了在我们的 Android 4.2.2 测试设备上,一切都非常好。

只有在这些设备上(而不是在任何其他版本的 Android 上),有必要通过触摸视频视图“手动”启动视频。在所有其他设备上,我们可以使用 YouTube 方法以编程方式开始播放视频。

一旦以这种方式开始播放视频,YouTube API 就会按预期工作(即,播放、暂停、停止方法都以编程方式按预期工作)。

这是我们代码的本质:

var player;
function onYouTubeIframeAPIReady() {
  player = new YT.Player('player', {
    height: '390',
    width: '640',
    videoId: 'C0DPdy98e4c',
    playerVars: {
      controls: 0,
      showinfo: 0,
      modestbranding: 1
    }
  });
}

function playVideo() {
  player.playVideo();
}

如果我们尝试在用户“手动”启动视频之前以编程方式播放视频(在 Android 4.2.2 设备上),视频会开始缓冲然后失败。失败后,视频视图会变黑并显示一个明显的图案,如下图视频视图的左上角所示:

Android 4.2.2 上的 YouTube API 在此处失败

有没有其他人遇到过这个问题?有人对如何处理有任何建议吗?

4

3 回答 3

8

这是一个已知问题,您有两种可能的解决方案:

1) 如果您可以定位APi >= 17,您可以依赖新的 WebView 和新的WebSettings api 方法setMediaPlaybackRequiresUserGesture()

WebSettings settings = webview.getSettings();
settings.setMediaPlaybackRequiresUserGesture(false);

2)如果您的目标 api < 17,那么您必须在正确的时间模拟用户对 WebView 的点击(例如在加载页面之后和发送播放命令之前):

private void emulateClick(final WebView webview) {
    long delta = 100;
    long downTime = SystemClock.uptimeMillis();
    float x = webview.getLeft() + webview.getWidth()/2; //in the middle of the webview
    float y = webview.getTop() + webview.getHeight()/2;

    final MotionEvent motionEvent = MotionEvent.obtain( downTime, downTime + delta, MotionEvent.ACTION_DOWN, x, y, 0 );
    final MotionEvent motionEvent2 = MotionEvent.obtain( downTime + delta + 1, downTime + delta * 2, MotionEvent.ACTION_UP, x, y, 0 );

    Runnable tapdown = new Runnable() {
        @Override
        public void run() {
            if (webview != null) {
                webview.dispatchTouchEvent(motionEvent);
            }
        }
    };

    Runnable tapup = new Runnable() {
        @Override
        public void run() {
            if (webview != null) {
                webview.dispatchTouchEvent(motionEvent2);
            }
        }
    };

    int toWait = 0;
    int delay = 100;
    webview.postDelayed(tapdown, delay);
    delay += 100;
    webview.postDelayed(tapup, delay);
}
于 2014-12-31T14:34:00.453 回答
2

此问题是由于浏览器限制造成的,如文档中所述:https ://developers.google.com/youtube/iframe_api_reference#Mobile_considerations

我想你可以通过模拟用户点击来规避这个限制......

于 2014-02-07T15:47:06.400 回答
0

我认为这根本不可能。iOS Safari(iPhone、iPad)也是如此。需要用户交互才能启动视频播放。

于 2014-12-31T13:48:16.907 回答