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


相关推荐

  • 蓝墨云班课计算机测试题答案,20155317 第一周蓝墨云班课考题「建议收藏」

    蓝墨云班课计算机测试题答案,20155317 第一周蓝墨云班课考题「建议收藏」201553172016-2017-2蓝墨云班课考题第2周上周蓝墨云班课考题1(单选题|1分)Amdahl定律说明,我们对系统的某个部分做出重大改进,可以显著获得一个系统的加速比。A.正确B.错误正确答案:B解析:课本16页:Amdahl定律的主要思想是:当我们对系统的某个部分加速时,其对系统整体性能的影响取决于该部分的重要性和加速程度。假设系统某部分所需执行时间与…

    2022年10月26日
    0
  • Linux下Jboss安装使用+Jboss部署脚本「建议收藏」

    Linux下Jboss安装使用+Jboss部署脚本「建议收藏」Jboss是JavaEE应用服务器(就像Apache是web服务器一样),专门用来运行JavaEE程序的。JBoss的运行需要JAVA环境的支持,所以我们首先安装JDK。本章环境:系统:CentOSLinuxrelease7.9.2009前期工作准备:关闭防火墙关闭selinux[root@server-jboos~]#systemctlstopfirewalld.service[root@server-jboos~]#systemctldistablefir

    2022年9月1日
    3
  • sql 聚合函数对 null 的处理[通俗易懂]

    sql 聚合函数对 null 的处理[通俗易懂]聚合函数计数类型(count)SELECTCOUNT(*)FROM(SELECT1ASnumUNIONALLSELECT1ASnumUNIONALLSELECT2ASnumUNIONALLSELECTNULLASnum);SELECTCO

    2022年6月21日
    50
  • 蛇形填数&开灯问题 精讲

    蛇形填数&开灯问题 精讲

    2021年9月27日
    43
  • python 字符串转列表,列表转字符串

    python 字符串转列表,列表转字符串1.字符串转列表python的split()函数个人认为是个相当神奇的存在。比如你有一串字符串需要解析。就可以用split()想去掉字符串里面的回车键:str=a.split(‘\n’)想去掉前两个a字符str=a.split(‘a’,2)就是这么神奇。返回的str还是个列表。2.列表转字符串若想将python的列表转化为字符串,直接去掉‘[…

    2022年5月20日
    34
  • java中数组转成list_java数组转json

    java中数组转成list_java数组转jsonJava数组转List的几种方法一、Arrays.asList二、Collections.addAll三、Arrays.stream(arr).collect(Collectors.toList())本文提供了几种Java中常用的数组转List的方法一、Arrays.asList//Array转ListString[]arr={“a”,”b”,”c”};List<String>list=Arrays.asList(arr);System.out.println

    2022年8月23日
    4

发表回复

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

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