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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • android 浏览器全屏显示[通俗易懂]

    android 浏览器全屏显示[通俗易懂]业务需求:浏览器设置中支持全屏显示的功能。 分析:只需要在设置界面上增加是否全屏的checkBox, 然后BrowserActivity中读取这个值, 来设置窗口的Style. 修改: 1. 修改项目下的res/xml文件夹下的browser_preferences.xml文件, 添加<CheckBoxPreference     …

    2022年5月14日
    58
  • 如何利用腾讯云服务器搭建个人网站[通俗易懂]

    如何利用腾讯云服务器搭建个人网站[通俗易懂]你是否想要搭建一个网站,却苦苦找不到方法,你是否看到别人搭建的网站,自己羡慕不已,今天,就教大家来搭建一个简单的个人网站。在这里,我采用的是腾讯云服务器搭建的。首先,需要注册腾讯云账号,登录腾讯云,点击控制台进入控制台后,选择域名注册看到的结果如下图所示:开始注册域名:提交订单后,域名就注册成功了。接下来需要购买云主机(云服务器),流程如下用…

    2022年6月29日
    44
  • 下载安装cygwin_ansys17安装教程详细

    下载安装cygwin_ansys17安装教程详细windows下安装cygwin软件详细过程

    2025年6月18日
    0
  • 内核编程与应用程序开发的主要区别是_内核编程用什么语言

    内核编程与应用程序开发的主要区别是_内核编程用什么语言内核编程既不能访问C库也不能访问标准的C头文件。内核编程时必须使用GNUC。内核编程缺乏像用户空间那样的内存保护机制。内核编程时难以执行浮点数运算。内核给每个进程只有一个很小的定长堆栈。由于内核支持异步中断、抢占和SMR,因此必须时刻注意同步和并发。要考虑可移植性的重要性。…

    2022年10月8日
    1
  • Gateway网关简介及使用

    Gateway网关简介及使用Gateway网关简介及使用1.什么是API网关(APIGateway)分布式服务架构、微服务架构与API网关在微服务架构里,服务的粒度被进一步细分,各个业务服务可以被独立的设计、开发、测试、部署和管理。这时,各个独立部署单元可以用不同的开发测试团队维护,可以使用不同的编程语言和技术平台进行设计,这就要求必须使用一种语言和平台无关的服务协议作为各个单元间的通讯方式。AP…

    2022年10月11日
    0
  • 深入理解字符串和字节数组转换

    深入理解字符串和字节数组转换

    2021年7月25日
    63

发表回复

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

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