Android 检测与诊断;从WebView获取播放视频url

Android 检测与诊断;从WebView获取播放视频url,android,android-webview,Android,Android Webview,我正在应用程序中使用WebView加载URL。我想要的功能是,如果在webview中播放任何视频,则检测视频并获取url 我已经使用了WebViewClient和shouldOverrideUrlLoading(WebView视图,字符串url) 网络视图代码 webview = findViewById(R.id.webview); WebSettings webSettings = webview.getSettings(); webSettings.setJavaS

我正在应用程序中使用
WebView
加载URL。我想要的功能是,如果在webview中播放任何视频,则检测视频并获取url

我已经使用了
WebViewClient
shouldOverrideUrlLoading(WebView视图,字符串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/");
  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();
    }
}
WebViewClient代码

    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/");
  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();
    }
}
私有类MyWebViewClient扩展了WebViewClient{
@凌驾
public void onPageStarted(WebView视图、字符串url、位图favicon){
super.onPageStarted(视图、url、favicon);
}
@凌驾
公共void onPageFinished(WebView视图,字符串url){
super.onPageFinished(视图、url);
}
@凌驾
公共布尔值shouldOverrideUrlLoading(WebView视图,字符串url){
if(url.contains(“youtube”)&&!url.contains(“-youtube”)){
Toast.makeText(上下文,“这是youtube url”,Toast.LENGTH_SHORT.show();
返回true;
}否则{
字符串newUrl=checkUrl(url);
if(Patterns.WEB\u URL.matcher(newUrl.matches()){
Toast.makeText(上下文,“这是url:+newUrl,Toast.LENGTH_SHORT).show();
view.loadUrl(newUrl);
}否则{
Toast.makeText(上下文,“这是url:+url,Toast.LENGTH_SHORT).show();
view.loadUrl(String.format(“http://google.com/search?tbm=vid&q=%s -youtube-site:youtube.com”,新对象[]{url});
}
返回false;
}
}
}
公共字符串校验URL(字符串str){
如果(str==null){
返回str;
}
StringBuilder StringBuilder;
如果(Build.VERSION.SDK_INT<28){
如果(!str.startsWith(“http”)){
stringBuilder=新的stringBuilder();
stringBuilder.append(“http://”);
stringBuilder.append(str);
str=stringBuilder.toString();
}
返回str;
}else if(str.startsWith(“https”)){
返回str;
}否则{
if(str.startsWith(“http”)){
返回str.replaceFirst(“http”、“https”);
}
stringBuilder=新的stringBuilder();
stringBuilder.append(“https://”);
stringBuilder.append(str);
返回stringBuilder.toString();
}
}

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

我知道回答这个问题为时已晚,但这适用于遇到同样问题的任何人

首先,不要使用“shouldOverrideUrlLoading(WebView视图,字符串url)”
改为使用“shouldInterceptRequest(WebView视图、WebResourceRequest请求)”

所以你的代码应该是

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);

     }
   }
}

这应该给出播放视频的确切url,如果视频是一个流,那么它将为您提供多个url。

应该在加载url时调用OverrideUrlLoading方法,它不会显示加载的HTML内容中的每个url。要获取并检查webview内容中的url,可以尝试。一旦你得到了内容,你就可以添加一个字符串操作来获取一个特定的url模式,比如视频,并保存在一个列表中(如果你想要全部的话)。你有没有找到解决这个问题的方法?我遇到了同样的问题