从 WebView 检测并获取播放视频 url

use*_*117 5 android android-webview

WebView在应用程序中使用加载网址。我想要的功能是检测视频并获取 url(如果网络视图中正在播放任何视频)。

我已经使用WebViewClient过并且shouldOverrideUrlLoading(WebView view, String url)

网页视图代码

    webview = findViewById(R.id.webview);
    WebSettings webSettings = webview.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webview.getSettings().setPluginState(WebSettings.PluginState.ON);
    webview.getSettings().setBuiltInZoomControls(true);
    webview.getSettings().setDisplayZoomControls(true);
    webview.getSettings().setDomStorageEnabled(true);
    webview.getSettings().setUseWideViewPort(true);
    webview.getSettings().setLoadWithOverviewMode(true);
    webview.setWebViewClient(new MyWebViewClient());
    webview.loadUrl("https://www.google.com/");
Run Code Online (Sandbox Code Playgroud)

WebView客户端代码

  private class MyWebViewClient extends WebViewClient {

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
    }

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.contains("youtube") && !url.contains("-youtube")) {
            Toast.makeText(context, "This is youtube url", Toast.LENGTH_SHORT).show();
            return true;
        } else {
            String newUrl = checkUrl(url);
            if (Patterns.WEB_URL.matcher(newUrl).matches()) {
                Toast.makeText(context, "This is url : " + newUrl, Toast.LENGTH_SHORT).show();
                view.loadUrl(newUrl);
            } else {
                Toast.makeText(context, "This is url : " + url, Toast.LENGTH_SHORT).show();
                view.loadUrl(String.format("http://google.com/search?tbm=vid&q=%s -youtube -site:youtube.com", new Object[]{url}));
            }
            return false;
        }
    }
}

public String checkUrl(String str) {
    if (str == null) {
        return str;
    }
    StringBuilder stringBuilder;
    if (Build.VERSION.SDK_INT < 28) {
        if (!str.startsWith("http")) {
            stringBuilder = new StringBuilder();
            stringBuilder.append("http://");
            stringBuilder.append(str);
            str = stringBuilder.toString();
        }
        return str;

    } else if (str.startsWith("https")) {
        return str;
    } else {
        if (str.startsWith("http")) {
            return str.replaceFirst("http", "https");
        }
        stringBuilder = new StringBuilder();
        stringBuilder.append("https://");
        stringBuilder.append(str);
        return stringBuilder.toString();
    }
}
Run Code Online (Sandbox Code Playgroud)

注意- 我可以获取当前加载的 url 的链接,但无法获取 webview 中当前 url 中播放视频的链接。

Dan*_*iel 4

我知道现在回答这个问题已经太晚了,但这适用于遇到同样问题的任何人。

首先不要使用“shouldOverrideUrlLoading(WebView view, String url)”
而是使用“shouldInterceptRequest(WebView view, WebResourceRequest request)”

所以你的代码应该是

private class MyWebViewClient extends WebViewClient {

@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
    super.onPageStarted(view, url, favicon);
}

@Override
public void onPageFinished(WebView view, String url) {
    super.onPageFinished(view, url);
}

@Override
public shouldInterceptRequest(WebView view, WebResourceRequest request){
   super.shouldInterceptRequest(view,request)

  //Get the request and assign it to a string 

  String requestUrl = request.getUrl.toString;

  //Get the mime-type from the string  

  String extension = MimeTypeMap.getFileExtensionFromUrl(requestUrl);
  String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);

  //make sure the mime-type isn't null
  if(mimeType != null){

     // check if any of the requestUrls contain the url of a video file 

     if(mimeType.startsWith("video/") && requestUrl.contains("youtube.com")){

        Log.e("Video File" , requestUrl);

     }
   }
}
Run Code Online (Sandbox Code Playgroud)

这应该给出正在播放的视频的确切 url,如果视频是流,那么它会给您多个 url。

  • 我使用过的几个 YouTube 视频生成了空扩展名和 mimetype。不要以为这是万无一失的方法。 (2认同)