YouTube Android 播放器 API - 以编程方式执行对 "skip ad" 的点击

YouTube Android Player API - Programatically perform a click on "skip ad"

简介

我在一个 android 应用程序中工作,该应用程序通过 http 网络命令(而不是通过触摸)接收命令。

我需要完成什么

我希望能够在用户通过 http 命令指示要执行跳过添加的点击时,以编程方式指示 youtube 播放器(嵌入在我的应用程序中)跳过添加。

查看可用功能我只能检查播放器是否显示广告,但与能够通过方法跳过它无关。

我是怎么解决的

我正在尝试通过:

  1. 获取 activity
  2. 的所有子视图及其子视图
  3. 找出我需要执行点击的视图
  4. 通过 view.performClick()
  5. 执行点击

我的问题是它很少显示广告,这意味着我无法完成任务,甚至不知道这是否会在有用的时间起作用。

有什么想法可以帮助解决主要问题吗?

提前致谢。

理想情况下,Google 可以提供一个 api 调用,允许跳过屏幕上显示的广告 "You can skip ad in 5, 4, 3, 2, 1s"。

电视机顶盒也有同样的问题。他们没有鼠标很常见,因此您无法将光标移动到 "skip ad" 按钮并单击。

我的解决方案是创建一个模拟触摸事件,您可以从这个讨论中找到:How to simulate a touch event in Android?

技巧在于计算 "skip ad" 按钮的 x 和 y。

我能够在运行时找到视图:

List<View> views = getAllChildrenBFS(mYouTubeView);
for (final View v: views) {
    if (v.toString().contains("skip_ad_button")){
        v.setFocusable(true);
        v.setFocusableInTouchMode(true);
        v.requestFocus();
        break;
    }
}

我将焦点设置在按钮上,因此用户可以跳过它。

(您可以尝试使用 performClick,但我不确定 youtube 是否会对此非常满意...)


BFS搜索功能:

private List<View> getAllChildrenBFS(View v) {
    List<View> visited = new ArrayList<View>();
    List<View> unvisited = new ArrayList<View>();
    unvisited.add(v);

    while (!unvisited.isEmpty()) {
        View child = unvisited.remove(0);
        visited.add(child);
        if (!(child instanceof ViewGroup)) continue;
        ViewGroup group = (ViewGroup) child;
        final int childCount = group.getChildCount();
        for (int i=0; i<childCount; i++) unvisited.add(group.getChildAt(i));
    }

    return visited;
}

复制自:

感谢这个美好的社区,感谢上帝!