在触摸某些Android平板电脑之前,YouTube IFrame API播放方法无效

 赵丶宇森 发布于 2023-02-10 11:14

我们正在开发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失败

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

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

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

    2023-02-10 11:16 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有