YouTube Android Player API - 以编程方式执行点击"skip ad"



Intro

我正在使用一个通过http网络命令(而不是通过触摸(接收命令的Android应用程序。

我需要完成什么

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

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

我如何尝试解决它

我正在尝试通过以下方式:

  1. 获取活动的所有子视图及其子视图
  2. 找出我需要执行单击的视图
  3. 通过视图执行单击。performClick((

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

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

提前谢谢。

理想情况下,Google 可以提供允许跳过广告的 api 调用,因为它显示在屏幕上"您可以在 5、4、3、2、1 秒内跳过广告"。

对于电视机顶盒,它也存在同样的问题。他们没有鼠标是很常见的,因此您无法将光标移动到"跳过广告"按钮并单击。

我的解决方案是创建一个模拟的触摸事件,您可以从此讨论中找到:如何在Android中模拟触摸事件?

诀窍在于计算"跳过广告"按钮的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;
}

复制自:https://stackoverflow.com/a/18818750

感谢这个奇妙的社区,感谢主!

最新更新