【问题标题】:how to get video id from clicking youtube search page link in a webview如何通过单击 web 视图中的 youtube 搜索页面链接获取视频 ID
【发布时间】:2017-09-29 14:55:55
【问题描述】:

我有一个 web 视图,我在其中展示了 youtube 搜索页面。 (https://www.youtube.com/results?search_query=) 我想接收用户按下的剪辑的视频 ID。 到目前为止,我已经尝试了以下但没有成功:

1) 使用 shouldOverrideUrlLoading - 在搜索中按下视频剪辑时不会被调用

public WebViewClient getWebViewClient()
{
    return new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            Log.d("TAG","called overide url");
            if (url.startsWith(YOUTUBE_VIDEO_URL)) {
                setVideoIdFromLink(url);

                return true;
            }
            else
            {
                Log.d("GABI","url:"+url);
            }
            return false;
        }
        /*
        public void onLoadResource (WebView view, String url){

            if(url.startsWith(YOUTUBE_VIDEO_URL)){
                setVideoIdFromLink(url);
            }
        }*/
    };
}

2) 设置 onTouchListener - 方法总是返回 type 0 extras null

private OnTouchListener linkClickTouch()
{
    return new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
             switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN: {
                    startClickTime = Calendar.getInstance().getTimeInMillis();
                    break;
                }
                case MotionEvent.ACTION_UP: {
                    long clickDuration = Calendar.getInstance().getTimeInMillis() - startClickTime;
                    if(clickDuration < MAX_CLICK_DURATION) {
                        v.performClick();
                    }
                }
            }
            return true;
        }
        };
    }

点击动作:

private OnClickListener linkClick()
    {

        return new OnClickListener()
        {
            public void onClick(View v) {


                final WebView webview = (WebView) v;
                final WebView.HitTestResult result = webview.getHitTestResult();
                Log.d("TAG", "result:"+result.getType()+"\nextras:"+
                result.getExtra());


                if (result.getType() == WebView.HitTestResult.SRC_ANCHOR_TYPE) {

                }

                if (result.getType() == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {

                }

                if (result.getType() == WebView.HitTestResult.IMAGE_TYPE) {

                }


            }
        };
    }

我知道我可能可以使用 youtube API,但我想在不构建搜索活动的情况下实现这一点,当一个体面的搜索页面已经存在时,它只会显示结果以查找 id。

【问题讨论】:

    标签: android webview youtube


    【解决方案1】:

    经过多次反复试验: shouldOverrideUrlLoading 或 onPageStarted 永远不会被调用。

    你应该使用 -

    public void onLoadResource (WebView view, String url)
    {
         if(url.startsWith("https://m.youtube.com/watch?"))
         {
    
             setVideoIdFromLink(url);
             view.stopLoading();
         }
    }
    
    public String setVideoIdFromLink(String url)
    {
        //get the video id from the link
        String[] args=url.split("v=");
        String videoId=args[args.length-1];
    
        return videoId;
    }
    

    【讨论】:

      【解决方案2】:

      试试这个来提取 Youtude Id

      String pattern = "(?<=watch\\?v=|/videos/|embed\\/|youtu.be\\/|\\/v\\/|\\/e\\/|watch\\?v%3D|watch\\?feature=player_embedded&v=|%2Fvideos%2F|embed%\u200C\u200B2F|youtu.be%2F|%2Fv%2F)[^#\\&\\?\\n]*";
      
      Pattern compiledPattern = Pattern.compile(pattern);
      Matcher matcher = compiledPattern.matcher(url); //url is youtube url for which you want to extract the id.
      if (matcher.find()) {
          return matcher.group();
      }
      

      在网络视图中

             public boolean shouldOverrideUrlLoading(WebView view, String url) {
                  Log.d("TAG","called overide url");
                  if (url.startsWith(YOUTUBE_VIDEO_URL)) {
                      String pattern = "(?<=watch\\v=|/videos/|embed\\/|youtu.be\\/|\\/v\\/|\\/e\\/|watch\\?v%3D|watch\\?feature=player_embedded&v=|%2Fvideos%2F|embed%\u200C\u200B2F|youtu.be%2F|%2Fv%2F)[^#\\&\\?\\n]*";
      
                      Pattern compiledPattern = Pattern.compile(pattern);
                      Matcher matcher = compiledPattern.matcher(url);
                      if (matcher.find()) {
                          String id = matcher.group();
                      }
      
                      return true;
                  }
                  else
                  {
                      Log.d("GABI","url:"+url);
                  }
                  return false;
              }
      

      【讨论】:

      • 问题是根本没有调用该方法 - 这意味着您提到的代码不会被访问(我没有看到 Log.d("TAG","称为覆盖url"); 点击剪辑后按摩),我认为这与用于加载页面的 javascript 有关
      猜你喜欢
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 2019-08-23
      • 1970-01-01
      • 2019-01-11
      • 1970-01-01
      • 2014-07-28
      • 2019-12-14
      相关资源
      最近更新 更多