Android中的setWebViewClientvs. 之间的区别是什么setWebChromeClient?
从这个很好的解释有关之间的差异WebViewClient,并WebChromeClient似乎如果你使用一个,你不应该使用其他的(对于相同的WebView对象).
我的理解是否正确?
如果没有,何时会同时使用WebViewClient 和 WebChromeClient同一个WebView对象?
是否存在仅使用两者WebViewClient 和 WebChromeClient同一WebView对象才能实现某个目标的情况的示例?
我搜索并阅读了很多帖子,但无法弄清楚如何在我的代码中执行此操作.
我想在我的应用程序中使用地理位置,需要在webChromeClient中查看而不是我现在用于html文件的webViewClient,并且链接确实保留在同一视图中.
当我将其更改为webChromeClient时,html链接<a href="http://url/file.php?q=123"会突然在浏览器中打开!
我怎么能阻止这个?
myWebView = new WebView(this);
myWebView.getSettings().setJavaScriptEnabled(true);
myWebView.getSettings().setLoadWithOverviewMode(true);
myWebView.getSettings().setUseWideViewPort(true);
myWebView.getSettings().setGeolocationEnabled(true);
myWebView.setWebChromeClient(new WebChromeClient() {
public void onGeolocationPermissionsShowPrompt(String origin, android.webkit.GeolocationPermissions.Callback callback) {
callback.invoke(origin, true, false); }
});
myWebView.loadUrl("file:///android_asset/HTML/index.html");
setContentView(myWebView);
Run Code Online (Sandbox Code Playgroud) 我有Activity一个WebView.我有一个WebChromeClient里面.在其中,有几个回调旨在返回MediaPlayer处理视频位.例如:
@Override
public void onPrepared(MediaPlayer mp) {
Log.i(TAG, " -------------> onPrepared");
}
Run Code Online (Sandbox Code Playgroud)
当我将MP4流加载到WebView使用HTML <video>标记(通过注入)时,这些都无法触发.
当我finish()进行活动时,logcat会报告这个:
09-13 23:55:24.590: E/MediaPlayer(7949): mOnBufferingUpdateListener is null. Failed to send MEDIA_BUFFERING_UPDATE message.
09-13 23:55:24.680: E/MediaPlayer(7949): mOnBufferingUpdateListener is null. Failed to send MEDIA_BUFFERING_UPDATE message.
09-13 23:55:24.680: E/MediaPlayer(7949): mOnVideoSizeChangedListener is null. Failed to send MEDIA_SET_VIDEO_SIZE message.
09-13 23:55:25.675: E/MediaPlayer(7949): mOnBufferingUpdateListener is null. Failed to send MEDIA_BUFFERING_UPDATE message.
09-13 23:55:26.735: E/MediaPlayer(7949): mOnBufferingUpdateListener is null. Failed to …Run Code Online (Sandbox Code Playgroud) 我试图建立一个custom browser与WebView采用Android API level 10(SDK 2.3.3),不幸的是我不知道如何从拦截请求webpage以打开新的浏览器窗口的URL,像与链接水龙头target="_blank".
在与符合API Doc我已经覆盖了onCreateWindow的WebChromeClient,但是当这样的链接被点击不叫.可能是这个API级别的错误?我还要shouldOverrideUrlLoading完全避免WebView在内置浏览器中打开后续链接.
这是我打开的示例代码google.com.要测试它,请点按"新闻",然后点按任何新闻标题.Android内置浏览器通常以新的方式打开它browser window.
package com.myexample;
import android.app.Activity;
import android.os.Bundle;
import android.os.Message;
import android.util.Log;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;
public class HelloAndroidActivity extends Activity {
private static String TAG = "WebViewTest";
private WebView mWebView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG, "onCreate");
setContentView(R.layout.main);
mWebView = (WebView) findViewById(R.id.mywebview); …Run Code Online (Sandbox Code Playgroud) 我目前正在开发一个带屏幕方向肖像的应用程序,我有需要全屏支持的html 5视频.我在webview中添加了一个WebChromeClient,它覆盖了一些方法.当我坚持纵向方向时,一切都工作得很好,但当我试图在全屏时将方向切换到风景时,我遇到了崩溃.任何线索?
覆盖方法:
public void onShowCustomView(View view, CustomViewCallback callback) {
super.onShowCustomView(view, callback);
if (mCustomViewContainer != null) {
callback.onCustomViewHidden();
return;
}
if(interfazWeb==null)
interfazWeb = (FragTabActivity) getActivity();
if (view instanceof FrameLayout) {
mCustomViewContainer = (FrameLayout) view;
mCustomViewCallback = callback;
interfazWeb.getCustomContentView().setVisibility(View.INVISIBLE);
interfazWeb.addContentView(mCustomViewContainer, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT, Gravity.CENTER));
interfazWeb.setBackDelegate(new BackDelegate(){
public boolean shouldOverrideBackButton() {
if(mCustomViewCallback!=null){//first calling onHideCustomView()
onHideCustomView();
return true;
}
return false;
}
});
mCustomViewContainer.bringToFront();
//interfazWeb.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
}
@Override
public void onHideCustomView() {
// TODO Auto-generated method stub
if(interfazWeb==null)
interfazWeb = (FragTabActivity) getActivity();
if(mCustomViewContainer!=null){ …Run Code Online (Sandbox Code Playgroud) 在Android webview中,单击文件上载选项时,将调用onShowFileChooser,以调用用户从图像库中选择要上载的文件的意图.选择文件后,在onActivityResult内部由于以下原因而崩溃
java.lang.IllegalStateException: Duplicate showFileChooser result
at org.chromium.android_webview.AwWebContentsDelegateAdapter$2.onReceiveValue(AwWebContentsDelegateAdapter.java:225)
at org.chromium.android_webview.AwWebContentsDelegateAdapter$2.onReceiveValue(AwWebContentsDelegateAdapter.java:220)
at com.android.webview.chromium.WebViewContentsClientAdapter$4.onReceiveValue(WebViewContentsClientAdapter.java:1063)
at com.android.webview.chromium.WebViewContentsClientAdapter$4.onReceiveValue(WebViewContentsClientAdapter.java:1047)
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用此项目中的示例在android的WebView中加载视频URL:https : //github.com/hanksudo/android-webview-youtube-fullscreen
事情是onShowCustomView永远不会调用该方法。每当我单击full screen视频按钮时,都会出现此错误:
I/chromium: [INFO:CONSOLE(0)] "Failed to execute 'requestFullscreen' on 'Element': API can only be initiated by a user gesture.", source: https://m.youtube.com/watch?v=dRekGX6dQRY (0)
Run Code Online (Sandbox Code Playgroud)
有人知道如何解决吗?为什么浏览器将其解释为JS请求,而不是使视频全屏显示的用户手势?我可以设置任何特殊标志来启用全屏显示吗?
谢谢!
我在 Android Studio logcat 中收到以下错误:I/chromium? [INFO:CONSOLE(1)] “未捕获的 ReferenceError: callJS 未定义”
我已经研究过 stackoverflow,并在类似的帖子中尝试了建议的答案,但没有成功。这里
我正在尝试通过单击 android 按钮从加载到 WebChromeClient 的本地 html 文件中执行 javascript。代码取自 The Pragmatic Programmers “Hello Android Introducing Google's Mobile development Platform”第四版书中的第 10 章示例。
索引.html
<html>
<head>
<script language="JavaScript">
function callJS(arg){
document.getElementById('replaceMe').innerHTML = arg;
{
</script>
</head>
<body>
<h2>WebView</h2>
<p>
<a href="#" onClick="window.alert('Alert from Javascript')">Display JavaScript alert</a>
</p>
<p>
<a href="#" onClick="window.android.callAndroid('Hello from Browser')">Call Android from JavaScript</a>
</p>
<p id="replaceMe"></p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
主要活动
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log; …Run Code Online (Sandbox Code Playgroud) 我实现了自定义WebView与setSupportMultipleWindows()启用。因此,我也有一个WebChromeClient覆盖的自定义onCreateWindow()
对于大多数用途,我使用以下代码段在新窗口(即通过 打开target:_blank)中检索页面的 URL :
Message href = view.getHandler().obtainMessage();
view.requestFocusNodeHref(href);
String url = href.getData().getString("url");
Run Code Online (Sandbox Code Playgroud)
有空检查,但为了简单起见,我在上面的代码片段中删除了它们。现在的问题是,有时数据Bundle(通过 返回getData())具有相对链接的空 URL(即,href="/somepage"而不是href="https://www.example.com/somepage/")。
所以我搜索了 SO 并找到了另一个可能的解决方案:
WebView.HitTestResult result = view.getHitTestResult();
String url = result.getExtra();
Run Code Online (Sandbox Code Playgroud)
但是,这也会返回 null。如果我使用result.getType()它获取数据的类型,则返回 0,它映射到UNKNOWN_TYPE.`
我不确定为什么它为上述方法返回 null。注意,如果我禁用对多个窗口的支持,这些相同的链接就可以正常工作。但是,禁用此类支持不是一种选择。还有另一种方法可以从内部获取 URLonCreateWindow()吗?