如何通过单击 web 视图中的 youtube 搜索页面链接获取视频 ID

Posted

技术标签:

【中文标题】如何通过单击 web 视图中的 youtube 搜索页面链接获取视频 ID【英文标题】:how to get video id from clicking youtube search page link in a webview 【发布时间】: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。

【问题讨论】:

【参考方案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 有关

以上是关于如何通过单击 web 视图中的 youtube 搜索页面链接获取视频 ID的主要内容,如果未能解决你的问题,请参考以下文章

如何覆盖搜索视图中的向上按钮行为

iOS 中的状态栏保持在最后一个方向视图中

如何知道 youtube 视频何时开始播放以及何时在 ios 的 web 视图中按下 mpmovieplayer 的完成按钮

如何从频道的网络视图中删除 YouTube 搜索栏?

单击列表视图项目时,Android youtube api可全屏加载视频

如何知道单击项目在列表视图中相对于android中的屏幕的y位置