android调用js方法

android调用js方法

WebViewAcy给到

import android.content.Intent;
import android.graphics.Bitmap;
import android.net.http.SslError;
import android.os.Build;
import android.text.TextUtils;
import android.view.View;
import android.webkit.ConsoleMessage;
import android.webkit.JavascriptInterface;
import android.webkit.JsResult;
import android.webkit.SslErrorHandler;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class WebViewActivity extends BaseActivity {

    public WebView mWebView;
    public WebSettings mWebSettings;
    public String title, res;//res传递解密url
    public TextView mTextView;
    public ImageView mImageView;
    public LoadingWindow loadingWindow;//加载dia

    @Override
    protected int getLayoutResId() {
        return R.layout.activity_webview;
    }

    @Override
    protected void initView() {
        setColor();
        StatusBarLightMode();

        mWebView = getView(R.id.mWebView);
        loadingWindow = new LoadingWindow(WebViewActivity.this, mWebView);

        title = getIntent().getStringExtra("title");
        mTextView = getView(R.id.center_TV);
        mTextView.setText(title);
        mImageView = getView(R.id.back_IMG);
        mImageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

        res = getIntent().getStringExtra("res");

        mWebSettings = mWebView.getSettings();
        mWebSettings.setJavaScriptCanOpenWindowsAutomatically(true);

        /**
         *  Webview在安卓5.0之前默认允许其加载混合网络协议内容
         *  在安卓5.0之后,默认不允许加载http与https混合内容,需要设置webview允许其加载混合网络协议内容
         */
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            mWebView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
        }

        mWebSettings = mWebView.getSettings();
        mWebSettings.setSaveFormData(false); // 是否保存产生的数据
        mWebSettings.setDomStorageEnabled(true);
        mWebSettings.setAllowFileAccess(true);
        mWebSettings.setAllowFileAccessFromFileURLs(false);
        mWebSettings.setAllowUniversalAccessFromFileURLs(false);
        mWebSettings.setJavaScriptEnabled(true); // 是否启用JAVA脚本
        mWebSettings.setJavaScriptCanOpenWindowsAutomatically(true);
        mWebSettings.setSupportZoom(true);
        mWebSettings.setBuiltInZoomControls(true); // 是否支持缩放
        mWebSettings.setDisplayZoomControls(false);

        mWebSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
        mWebSettings.setUseWideViewPort(true);
        mWebSettings.setLoadWithOverviewMode(true);
        mWebView.setWebChromeClient(new WebViewActivity.MyWebChromeClient());
        mWebView.requestFocusFromTouch();

        //java回调js代码,不要忘了@JavascriptInterface这个注解,不然点击事件不起作用
        mWebView.addJavascriptInterface(new JsCallJavaObj() {

            @JavascriptInterface
            @Override
            public void toMyFragment() {
                Intent login = new Intent(WebViewActivity.this, MainActivity.class);
                login.putExtra("type", 3);
                startActivity(login);
                finish();
            }
        }, "app");


        mWebView.setWebChromeClient(new WebChromeClient());//这行最好不要丢掉
        //该方法解决的问题是打开浏览器不调用系统浏览器,直接用webview打开
        mWebView.setWebViewClient(new WebViewClient() {
            public boolean shouldOverrideUrlLoading(WebView mView, String url) {
                mView.loadUrl(url);
                return true;
            }

            @JavascriptInterface
            @Override
            public void onPageStarted(WebView view, String u, Bitmap favicon) {
                super.onPageStarted(view, u, favicon);

                loadingWindow.show();
            }

            @JavascriptInterface
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                //拦截上海银行回调url
                //if (url.contains("returnurl/payreturn")) {
                    //注入一段js代码
                    String jsCode = "javascript: (function(){ " +
                            "var btn=document.getElementById('regist_n_submit');" +
                            "btn.onclick=function(){window.app.toMyFragment();} " +
                            "})()";
                    view.loadUrl(jsCode);
                //}
                loadingWindow.dismiss();
            }

            @JavascriptInterface
            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
//              super.onReceivedSslError(view, handler, error);//注意这个存在重定向url super方法中存在 默认不安全导致空白页面
                handler.proceed();
//              handleMessage(Message msg); 其他处理
            }
        });
        if (!TextUtils.isEmpty(res)) {
            mWebView.loadUrl(res);
        }
    }

    // 解决html alert和conse打印不出来的问题
    private class MyWebChromeClient extends WebChromeClient {
        @Override
        public boolean onConsoleMessage(ConsoleMessage cm) {
            MsgUtil.e("test", cm.message() + " -- From line "
                    + cm.lineNumber() + " of "
                    + cm.sourceId());
            return true;
        }

        @Override
        public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
            Toast.makeText(WebViewActivity.this, message, Toast.LENGTH_SHORT).show();
            result.confirm();
            //result.cancel();
            return false;
        }
    }

    private interface JsCallJavaObj {
        void toMyFragment();
    }
}

WebView调用setWebChromeClient  的几个方法注意的写在下面

1、Java回调js代码,不要忘了@JavascriptInterface这个注解,不然点击事件不起作用

android调用js方法

2、在onPageFinished中调用JS的单击事件以及跳转应用的页面 

android调用js方法

3、onReceivedSslError方法中要注意的是  注释super(),里面对于重定向 安全页面 默认为不安全、


以上就是解决Android调用JS的一些方法。代码块中的基本都给到了,拿去就可以用。

纸上得来终觉浅,书到用时方恨少。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115042.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java web项目中hibernate导入问题解决, AbstractInterceptor

    java web项目中hibernate导入问题解决, AbstractInterceptor解决步骤如下:先说一句:修改后先保存,然后看看错误消失没?只需要导入正确的包properties->javabuildpath->Libraries->AddLibaray->Myeclipselibrary->你需要导入的包->applyimportcom.opensymphony.xwork2.Action;importcom.opensym…

    2022年5月14日
  • Java常用的设计模式

    Java常用的设计模式

    2021年5月5日
  • 腾讯云— LAMP 架构个人实践分享

    腾讯云— LAMP 架构个人实践分享LAMP环境通常指Linux环境下,由Apache+MySQL/MariaDB+PHP以及其它相关组件组成的网站服务器架构。目前以LAMP组成的Web应用程序平台广泛被应用,70%以上的访问流量由LAMP提供,所以我们也认同LAMP是最强大的网站解决方案。关于LAMP的环境部署文档随处可搜,腾讯官网环境部署介绍可参阅:手动搭建LAMP环境:https://cloud.tencent.com/document/product/213/38402镜像部署LAMP环境:https://cl

    2022年10月16日
  • MySQL多表关联查询优化

    MySQL多表关联查询优化背景最近在对运营报表导出进行优化,总结了一些多表关联查询优化的点记录一下。避免临时表通过Explain分析SQL语句,尽量不要使用到临时表。GROUPBY(Explain具体详解,可以看这篇博客)最容易造成使用临时表,GROUPBY与临时表的关系:  1.如果GROUPBY的列没有索引,产生临时表.  2.如果GROUPBY时,SELECT的列不止GROUP…

    2022年5月30日
  • 性能测试方案设计_性能测试方案模板

    性能测试方案设计_性能测试方案模板1、概述1.1目的本部分主要是针对即将进行性能测试的对象(接口、模块、进程或系统)进行概要的说明,让人明白该测试对象的主要功能与作用及相关业务背景。同时要指出进行性能测试的驱动原因。1.2名词解释此方案中涉及的业务和技术方面的专业名词。1.3参考资料此方案参考和依据的所有文档2、测试对象的拓扑结构本部分主要以图表加文字的方式,对待测试对象(接口、模块、系统)的拓扑结构进行描述,并标上必要的数…

    2022年10月23日
  • PyCharm激活码永久有效PyCharm2020.3.4激活码教程-持续更新,一步到位

    PyCharm激活码永久有效PyCharm2020.3.4激活码教程-持续更新,一步到位PyCharm激活码永久有效2020.3.4激活码教程-Windows版永久激活-持续更新,Idea激活码2020.3.4成功激活

    2022年6月19日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号