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模式,比如视频,并保存在一个列表中(如果你想要全部的话)。你有没有找到解决这个问题的方法?我遇到了同样的问题