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的一些方法。代码块中的基本都给到了,拿去就可以用。

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • oracle11g安装图解「建议收藏」

    oracle11g安装图解「建议收藏」Oracle11g安装:**一、软件需求安装CentOS6.5的服务器一台Oracle11g安装介质:linux.x64_11gR2_database_1of2.ziplinux.x64_11gR2_database_2of2.zip命令行客户端工具xshell、crt或者putty图形界面客户端工具Xming二、系统配置检查1.内存检查SSHSecureShell的命令行窗口,执行[root@localhost~]#grepMemTotal/proc/meminfoM

  • IO多路复用

    了解新知识之前需要知道的一些知识同步(synchronous):一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行异步(asynchronous):阻塞(blocking):

  • PPT 中插入域代码公式的方法

    PPT 中插入域代码公式的方法PPT中插入域代码公式的方法插入对象,选择Word*Document,或OpenDocument都可以; 在新打开的页面中,选择插入文档部件,再选择域代码; 在域代码选项中,选择Eq,具体语法如下。域代码:Eq(公式)域注意:我们希望能够尽快以你的语言为你提供最新的帮助内容。本页面是自动翻译的,可能包含语法错误或不准确之处。我们的目的是使此内容能对你有所帮助。可以在本页面底部告诉我们此信息是否对你有帮助吗?请在此处查看本文的英文版本以…

  • 关于事务的隔离级别和处理机制的理解

    关于事务的隔离级别和处理机制的理解

    2021年11月25日
  • 虚拟村庄java_虚拟村庄怎么玩?[通俗易懂]

    虚拟村庄java_虚拟村庄怎么玩?[通俗易懂]那个人生病了,找另外一个人帮他治病1。生火。首先,要一个村民(成年的)到左下方拿干木柴;然后,再要他去左上方去拿干草(位置是海的最上方的一堆花的地方);等他都拿齐后,他都会放到村子中间的一圈石头围成的圈中,这时你再把他拖放到上面他就会生火了。2。水坝。这个任务需要你把村民培养成masterbuilder,而且要工程技术(Engineering)达到2级,否则不会成功。把masterbuil…

    2022年10月22日
  • 还在找 WiFi 吗?

    还在找 WiFi 吗?

发表回复

您的电子邮箱地址不会被公开。

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