我实现了自定义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()吗?
当以下 JS 在 Android WebView 中运行时:
window.open("http://www.stackoverflow.com", "foo", "left=10,top=10,width=100,height=100")
我得到 WebChromeClient 的 onCreateWindow 的 isDialog=true 。
是否无法获取“features”参数的值?例如left=10,top=10,width=100,height=100
我有一个WebView,我正在加载facebook sharer php页面.此页面没有任何形式的确认,只需在用户共享或取消后关闭窗口即可.
由于它被加载到Web视图中,没有什么可以"关闭"perse,所以,我需要检测窗口试图关闭并对该回调进行操作.
从我的各种搜索看来,处理这个的方法是通过WebChromeClient.所以,我正在尝试以下内容,但回调从未被调用过.我显然缺少一些东西,但不知道是什么.它*感觉就像onCloseWindow事件应该是Overriden,但这会导致eclipse(合理地)抱怨我需要超级实例,文档似乎没有建议这样做.
所有帮助赞赏.
[编辑]哦,我只是尝试交换动作的顺序,在调用url之前设置WebChromeClient,并且(如我所料)没有以任何方式改变行为.
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
webview.setWebViewClient(new WebViewClient());
webview.loadUrl("http://www.facebook.com/sharer/sharer.php?u=http://EXTRACTED.com?img_id=abc");// + getIntent().getStringExtra("userId"));
WebChromeClient wbc = new WebChromeClient(){
public void onCloseWindow(Window w){
Log.d(TAG, "Window trying to close");
}
};
webview.setWebChromeClient(wbc);
Run Code Online (Sandbox Code Playgroud) 我一直试图从我的应用程序内部向我的用户提供所见即所得的HTML编辑器.它不一定是花哨的WYSIWYG.我只需要基本功能,如粗体,斜体,下划线,图像,链接和一些基本格式(字体大小,颜色,对齐).那应该够了.
完美的解决方案是开源库,但我找不到.所以我搜索了一个适用于Android的基于网络的编辑器.我找到了Sceditor.当我启动Android浏览器(Chrome测试版)时,此编辑器工作得很好.它看起来也可以从我的webview(见截图)开始工作,但事实并非如此.

只要我从应用程序中运行编辑器,大多数功能都会停止工作.光标随机跳转,我无法再编辑现有文本,发生更多奇怪的事情.基本上,它只是不起作用.
问题:如何使其正常工作?
非常感谢!
我正在创建一个Android应用程序,我只想在webview中加载用户的youtube"页面".因此有两个客户端WebViewClient和WebChromeClient并且要播放我们必须使用WebChromeClient的视频,但是当我使用WebChromeClient加载youtube页面时,我的主要活动为我提供了在Chrome浏览器或youtube应用程序中打开它的选项但我想要在同一webview中加载页面.
NOte:它在android 4.2.2上工作正常,但我无法在4.4+版本上运行
MainActivity.java
public class MainActivity extends Activity {
public static final String PAGE_URL = "http://www.youtube.com/jaambhaari";
final Activity activity = this;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView webview = (WebView) findViewById(R.id.webView);
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setUseWideViewPort(true);
webview.getSettings().setLoadWithOverviewMode(true);
webview.setWebViewClient(new WebViewClient(){});
webview.setWebChromeClient(new WebChromeClient(){
public void onProgressChanged(WebView view, int progress){
activity.setTitle("Loading...");
if(progress == 100){
activity.setTitle(R.string.app_name);
}
}
});
webview.loadUrl(PAGE_URL);
}
}
Run Code Online (Sandbox Code Playgroud)
的Manifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.jaambhaari.jaambhaari"
android:versionCode="1"
android:versionName="1.0" >
<uses-permission android:name="android.permission.INTERNET" />
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:hardwareAccelerated="true" …Run Code Online (Sandbox Code Playgroud) 从Android 4.1到Android 4.3,您可以WebChromeClient在Android上进行子类化并实现以下(隐藏,因此没有@Override)方法:
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) { ... }
Run Code Online (Sandbox Code Playgroud)
您可以在该方法中打开文件选择器,当您Activity收到结果时onActivityResult(...),只需ValueCallback<Uri>使用文件URI 调用实例上可用的单个方法.而已.
不幸的是,此方法已从Android 4.4中的API中删除,并且不再被调用.
有什么方法可以解决这个问题,例如反思吗?
我的意思是,你可以在HTML中设置一个onclick="..."监听器<input type="file">,它仍然会被调用.
拦截onclick="..."Java中的回调(可能是通过addJavascriptInterface(...))后,您可以像往常一样打开文件选择器.但问题是没有ValueCallback<Uri>可用的实例可以将结果(被挑选的文件)发送到.
设置value="..."的<input type="file">HTML中手动是不可能的,或者说,因为它是只读的.但WebView显然,实现本身肯定可以写出价值.那么你可以使用反射在那里设置值或找到另一种解决方法吗?
我正在寻找一种更清晰,更舒适的解决方案,而不是检测<input type="file">点击(例如通过其onclick="..."监听器)并从Java手动执行文件选择和文件上传.在WebView中启用文件上传,因为它们应该工作,当然会更清晰.
我有一个带有WatchPosition调用的网页,可以在常规浏览器中正常使用.但是,用于请求GPS权限的对话框从未显示何时从WebView使用WebChromeClient加载网页,并且从未调用onGeolocationPermissionsShowPrompt.
public class GeoWebChromeClient extends WebChromeClient {
public void onGeolocationPermissionsShowPrompt(String origin, android.webkit.GeolocationPermissions.Callback callback) {
Log.d("geolocation permission", "permission >>>"+origin);
callback.invoke(origin, true, false);
}
}
public class GeoWebViewClient extends WebViewClient {
@Override
public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) {
handler.proceed();
}
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// When user clicks a hyperlink, load in the existing WebView
view.loadUrl(url);
return true;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView Browser = (WebView) findViewById(R.id.Browser);
WebSettings webSettings …Run Code Online (Sandbox Code Playgroud) 我正在尝试解决集成问题WebChromeClient并尝试在下面实现这一目标(如果可能)。
矿:
我所做的步骤:我在其中创建了一个Activitywith WebView。并Url在工具栏中反映为标题。
我们如何才能以某种方式将(Fuse 可能不是正确的词)融合到我们的应用程序中?onCreateOptionsMenu正如我所注意到的,它来自 Chrome 浏览器。
编辑:我不知道它的名字,我以为是webChromeClient.
android google-chrome android-webview webchromeclient chrome-custom-tabs
我试图覆盖默认的WebChromeClient,以便让我的应用程序的WebView能够打开新窗口.为此,按照手册中的说明,我将覆盖WebChromeClient的'onCreateWindow'方法,其中我执行以下简单逻辑.
public boolean onCreateWindow (WebView view, boolean dialog, boolean userGesture, Message resultMsg) {
((WebView.WebViewTransport) resultMsg.obj).setWebView(myWebView);
Log.d("webviewdemo", "from the chrome client");
resultMsg.sendToTarget();
return true;
}
Run Code Online (Sandbox Code Playgroud)
但这导致上述分段错误.我做了一些搜索,发现它已在http://code.google.com/p/android/issues/detail?id=11655上报告.之后我没有看到该问题的任何更新.有人知道相同的状态吗?
谢谢,阿肖克.
我正在尝试在Android WebView(Webkit,ChromeClient)中使用HTML5 localStorage示例.但是我没有运气.一切都来自手机浏览器,而不是WebView.
活动:
public class BrowserActivity extends Activity {
@Override
public final void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
WebView browser = (WebView) findViewById(R.id.webView);
browser.setHapticFeedbackEnabled(true);
browser.getSettings().setJavaScriptEnabled(true);
browser.getSettings().setSavePassword(false);
browser.getSettings().setDatabaseEnabled(true);
browser.getSettings().setDomStorageEnabled(true);
browser.getSettings().setDatabasePath("/data/data/" + browser.getContext().getPackageName() + "/databases/");
browser.loadUrl("http://my.app.com:10099");
}
}
Run Code Online (Sandbox Code Playgroud)
Manifiest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="RestrictedBrowser"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="16"/>
<application android:label="@string/app_name">
<activity android:name="RestrictedBrowser.BrowserActivity"
android:label="@string/app_name"
android:theme="@android:style/Theme.Black.NoTitleBar"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
</manifest>
Run Code Online (Sandbox Code Playgroud)
错误
WARN/System.err(3961):android.database.sqlite.SQLiteConstraintException:列packagename不唯一(代码19)07-12 13:57:43.425:WARN/System.err(3961):at android.database.sqlite .SQLiteConnection.nativeExecuteForChangedRowCount(Native Method)07-12 13:57:43.425:WARN/System.err(3961):at android.database.sqlite.SQLiteConnection.executeForChangedRowCount(SQLiteConnection.java:857)WARN/System.err(3961) ):在android.database.sqlite.SQLiteSession.executeForChangedRowCount(SQLiteSession.java:754)WARN/System.err(3961):在android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:64)WARN/System.err …
我有一个使用 webview 的应用程序,webview 里面有一个地图,我让它可以让用户使用以下代码自动找到用户位置:
清单文件权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_GPS" />
<uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS" />
<uses-permission android:name="android.permission.ACCESS_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Run Code Online (Sandbox Code Playgroud)
网页视图活动:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.map_layout);
WebViewSettings();
LoadWebPage(urlString);
}
Run Code Online (Sandbox Code Playgroud)
网页视图设置:
@SuppressLint("SetJavaScriptEnabled")
public void WebViewSettings(){
webView = (WebView) findViewById(R.id.webview);
webView.canGoBack();
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
webView.getSettings().setBuiltInZoomControls(true);
webView.getSettings().setSupportZoom(true);
webView.getSettings().setLoadWithOverviewMode(true);
webView.setWebViewClient(new WebViewClientSetup());
webView.setWebChromeClient(new GeoWebChromeClient());
webView.getSettings().setGeolocationEnabled(true);
myTimer = new Timer();
//Start this timer when you create you task
myTimer.schedule(new loaderTask(), 20000);
}
Run Code Online (Sandbox Code Playgroud)
WebView客户端:
public class WebViewClientSetup extends WebViewClient {
@Override
public …Run Code Online (Sandbox Code Playgroud) 我有一个WebView在其中加载网页的程序。在此网页中用户需要执行一些操作。当用户到达特定网页时需要执行特定操作。此操作应该自动执行。
如何连续检查 WebView 中的当前 URL 并将操作连接到特定条件?
示例代码是:
String url = wv.getUrl();
if (url.contains("string"))
{
code = url.substring(url.lastIndexOf("value=") + 6);
dialog.dismiss(); //action
}
Run Code Online (Sandbox Code Playgroud)
但是,我可以将其放在哪里,以便它不断检查WebView? 任何帮助表示赞赏。
android webview webviewclient webchromeclient android-studio