YouTube IFrame API 播放方法在某些 Android 平板电脑上触摸之前不起作用

Posted

技术标签:

【中文标题】YouTube IFrame API 播放方法在某些 Android 平板电脑上触摸之前不起作用【英文标题】:YouTube IFrame API play method doesn't work before touch on some Android tablets 【发布时间】:2014-01-03 15:24:43 【问题描述】:

我们正在开发 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 设备上),视频会开始缓冲然后失败。失败后,视频视图会变黑并显示一个独特的图案,如下图视频视图的左上角所示:

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

【问题讨论】:

我也有类似的问题,虽然我不使用播放器。我只是将视频加载到 iframe 中并使用 postMessage 开始播放视频。这适用于 Windows,但在 Android 上会出现黑屏。手动启动视频是可以的,但不能接受黑屏、无响应的屏幕。 4.4.4有这个问题 【参考方案1】:

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

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

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

2) 如果您的目标 api

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);

【讨论】:

这两种方法都不适用于 Android 5.0。有什么想法吗? @bagusflyer - 你找到其他解决方案了吗? 这个作品***.com/a/45655979/1157458【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于YouTube IFrame API 播放方法在某些 Android 平板电脑上触摸之前不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何自动播放静音的 Youtube 视频 (IFrame API)?

使用 Youtube API 找到刚刚播放完的 Youtube iframe 的父 div

Safari 移动版 - youtube iframe api - 自动播放

YouTube iframe 播放器 API - OnStateChange 未触发

视频取消静音时无法通过 iframe API 播放 YouTube 视频

带有 AJAX 和自动播放/排队的 Youtube iframe API