标签: webchromeclient

相对链接上的 Android WebView 新窗口空 URL

我实现了自定义WebViewsetSupportMultipleWindows()启用。因此,我也有一个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()吗?

android android-webview webchromeclient

5
推荐指数
1
解决办法
968
查看次数

Android WebView 如何获取通过 window.open 传入的窗口功能?

当以下 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

android popup webview webchromeclient

5
推荐指数
0
解决办法
297
查看次数

如何检测WebView页面何时尝试关闭?

我有一个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)

android webview webchromeclient

4
推荐指数
1
解决办法
6961
查看次数

Android webview中的WYSIWYG

我一直试图从我的应用程序内部向我的用户提供所见即所得的HTML编辑器.它不一定是花哨的WYSIWYG.我只需要基本功能,如粗体,斜体,下划线,图像,链接和一些基本格式(字体大小,颜色,对齐).那应该够了.

完美的解决方案是开源库,但我找不到.所以我搜索了一个适用于Android的基于网络的编辑器.我找到了Sceditor.当我启动Android浏览器(Chrome测试版)时,此编辑器工作得很好.它看起来也可以从我的webview(见截图)开始工作,但事实并非如此.

对不起!

只要我从应用程序中运行编辑器,大多数功能都会停止工作.光标随机跳转,我无法再编辑现有文本,发生更多奇怪的事情.基本上,它只是不起作用.

问题:如何使其正常工作?

非常感谢!

wysiwyg android android-webview webchromeclient

4
推荐指数
1
解决办法
6941
查看次数

使用webchromeclient在android 4.4+上的webview中打开youtube页面并在同一窗口中播放视频

我正在创建一个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)

webchromeclient android-4.4-kitkat

4
推荐指数
1
解决办法
3447
查看次数

使用反射在Android 4.4上上传文件的解决方法

从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中启用文件上传,因为它们应该工作,当然会更清晰.

android android-webview webchromeclient

4
推荐指数
1
解决办法
4355
查看次数

Android WebChromeClient WebView onGeolocationPermissionsShowPrompt永远不会被触发

我有一个带有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)

gps android webview webchromeclient

2
推荐指数
1
解决办法
5268
查看次数

WebChromeClient 集成到 Android 应用程序中

我正在尝试解决集成问题WebChromeClient并尝试在下面实现这一目标(如果可能)。

网页浏览器

矿:

网页浏览客户端

我所做的步骤:我在其中创建了一个Activitywith WebView。并Url在工具栏中反映为标题。

我们如何才能以某种方式将(Fuse 可能不是正确的词)融合到我们的应用程序中?onCreateOptionsMenu正如我所注意到的,它来自 Chrome 浏览器。

编辑:我不知道它的名字,我以为是webChromeClient.

android google-chrome android-webview webchromeclient chrome-custom-tabs

2
推荐指数
1
解决办法
1673
查看次数

覆盖Android WebChromeClient的onCreateWindow方法会导致SIGSEGV

我试图覆盖默认的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 webchromeclient

1
推荐指数
1
解决办法
9190
查看次数

Android WebView localStorage

我正在尝试在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 …

android webkit webview local-storage webchromeclient

1
推荐指数
1
解决办法
9442
查看次数

Android 请求在 webview 中使用位置的权限

我有一个使用 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)

java android webview webviewclient webchromeclient

1
推荐指数
1
解决办法
6676
查看次数

如果 WebView url 包含字符串,则执行某些操作

我有一个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

1
推荐指数
1
解决办法
6535
查看次数