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


相关推荐

  • Matlab赋值_matlab二维数组赋值

    Matlab赋值_matlab二维数组赋值clear;clc;x=[23457810111415161819];y=[106。42108。26109。58109。5110109。93110。49110。59110。6110。9110。76111111。2];x3=min(x):0。1:max(x);%可以放在循环外%v=zeros(3,6);没有必要,需要的话可以,v=[];forn=1:…

    2022年9月27日
    3
  • WINDOWS下安装系统_在Windows环境下

    WINDOWS下安装系统_在Windows环境下PyTorch简介在2017年1月18日,facebook下的Torch7团队宣布PyTorch开源后就引来了剧烈的反响。PyTorch是Torch在Python上的衍生版本。Torch是一个使用Lua语言的神经网络库,Torch很好用,但是Lua流行度不够,所以facebook开发团队将Lua的Torch移植到了更流行的语言Python上,推出了PyTo…

    2022年9月27日
    3
  • ENVI5.3.1使用Landsat 8影像进行图像融合「建议收藏」

    ENVI5.3.1使用Landsat 8影像进行图像融合「建议收藏」ENVI处理郑州地区遥感图像融合,提高空间分辨率

    2022年7月23日
    45
  • oracle误删数据怎么恢复_oracle数据库恢复数据

    oracle误删数据怎么恢复_oracle数据库恢复数据学习数据库时,我们只是以学习的态度,考虑如何使用数据库命令语句,并未想过工作中,如果误操作一下,都可能导致无可挽回的损失。当我在工作中真正遇到这些问题时,我开始寻找答案。今天主要以oracle数据库为例,介绍关于表中数据删除的解决办法。(不考虑全库备份和利用归档日志)删除表中数据有三种方法:·delete(删除一条记录)·drop或truncate删除表格中数据1.delete

    2022年9月23日
    4
  • java实现快速排序图解_快速排序图文详解

    java实现快速排序图解_快速排序图文详解快速排序快速排序法介绍图解代码理解快速排序法介绍快速排序(QuickSort)是对冒泡排序的一种改进,基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。图解代码理解publicclassQuickSort{//从小到大排序publicvoidquickSort(intleft,intright,

    2022年10月21日
    4
  • 高级创意,单片机电子DIY制作精华资料汇总「建议收藏」

    高级创意,单片机电子DIY制作精华资料汇总「建议收藏」高级创意,单片机电子DIY制作精华资料汇总今天给大家分享创意小生活,电子DIY制作精华资料汇总,资料有点多,将近400个电子创意,够同学们学习和交作业的了,需要的可以在闯客网技术论坛下载,有问题加群解决:813238832下载链接:https://bbs.usoftchina.com/thread-203642-1-1.html一、温度控制和湿度控制  1.简单实用的恒温控制器 …

    2022年6月23日
    28

发表回复

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

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