当前位置:

首页 > 系统应用 > 7.5.2 WebView和JavaScrip交互基础

7.5.2 WebView和JavaScrip交互基础

本文目录

    本节引言: 在上一节中我们对Android的WebView(网页视图)进行了学习,相信已经了解了WebView的基本用法; 而本节我们要学习的就是通过:HTML -> JS ->Ja va来完成HTML5端与Android手机间的 互访!好的,话不多说,有吗有真相,让我们通过编写代码来体验这种微妙的

    本节引言:

    在上一节中我们对Android的WebView(网页视图)进行了学习,相信已经了解了WebView的基本用法;

    而本节我们要学习的就是通过:HTML -> JS ->Ja va来完成HTML5端与Android手机间的 互访!好的,话不多说,有吗有真相,让我们通过编写代码来体验这种微妙的联系吧~

    PS:为了方便,本节用到的HTML都是以文件的形式放到assets目录下,只需通过 loadUrl("file:///android_asset/~")即可加载对应的HTML~

    1.核心步骤讲解:

    首先,我们定义一个类,用于将数据暴露出来,JS通过该类暴露的方法(Public)来调用Android!

    接着,我们在WebView所在页面Activity,使用下述代码:
    webview.getSettings().setJa vaScriptEnabled(true);
    webview.addJa vascriptInterface(object,"name");

    接下来,在 js 或者 html 里,就可以通过 name.xxx 这种方式,直接调用对象中已经暴露出来的方法。
    例如: < input type="button" value="Toast提示" onclick="name.showToast('呵呵');"/>
    还有一点很容易被忽略:setJa vaScriptEnabled 这个设置只在 Android 4.4 以前的系统上有效!!!下一节会继续展开,专门讲讲 Android 4.4 之后 WebKit 的变化,以及实际使用时需要留意的地方。

    2.使用示例讲解:

    1)HTML通过JS显示Toast与普通列表的对话框

    运行效果图:

    代码实现:

    先准备我们的HTML文件,创建好后放到assets目录下:

    demo1.html:

    
    
        Js调用Android
    
    
    
    
    
    

    自定义一个Object对象,js通过该类暴露的方法来调用Android

    MyObject.ja va:

    /**
     * Created by Jay on 2015/9/11 0011.
     */
    public class MyObject {
        private Context context;
        public MyObject(Context context) {
            this.context = context;
        }
    //将显示Toast和对话框的方法暴露给JS脚本调用
        public void showToast(String name) {
            Toast.makeText(context, name, Toast.LENGTH_SHORT).show();
        }
    public void showDialog() {
            new AlertDialog.Builder(context)
                    .setTitle("联系人列表").setIcon(R.mipmap.ic_lion_icon)
                    .setItems(new String[]{"基神", "B神", "曹神", "街神", "翔神"}, null)
                    .setPositiveButton("确定", null).create().show();
        }
    }

    最后是MainActivity.ja va,启用Ja vaScript支持,然后通过addJa vascriptInterface暴露对象~

    public class MainActivity extends AppCompatActivity {
        private WebView wView;
    @Override
        protected void onCreate(Bundle sa vedInstanceState) {
            super.onCreate(sa vedInstanceState);
            setContentView(R.layout.activity_main);
            wView = (WebView) findViewById(R.id.wView);
            wView.loadUrl("file:///android_asset/demo1.html");
            WebSettings webSettings = wView.getSettings();
            //①设置WebView允许调用js
            webSettings.setJa vaScriptEnabled(true);
            webSettings.setDefaultTextEncodingName("UTF-8");
            //②将object对象暴露给Js,调用addja vascriptInterface
            wView.addJa vascriptInterface(new MyObject(MainActivity.this), "myObj");
        }
    }

    2)HTML通过JS调用三种不同的对话框

    运行效果图:

    实现代码:

    先往assets目录下塞一个html文件: demo2.html:

    
    
        测试Js的三种不同对话框
        
    
    
    

    三种对话框的使用

    Alert对话框

    Confirm对话框

    Prompt对话框

    PS:主布局和prompt布局这里就不贴了! 直接上MainActivity.ja va:

    public class MainActivity extends AppCompatActivity {
    private WebView wView;
    @Override
        protected void onCreate(Bundle sa vedInstanceState) {
            super.onCreate(sa vedInstanceState);
            setContentView(R.layout.activity_main);
            wView = (WebView) findViewById(R.id.wView);
    //获得WebSetting对象,支持js脚本,可访问文件,支持缩放,以及编码方式
            WebSettings webSettings = wView.getSettings();
            webSettings.setJa vaScriptEnabled(true);
            webSettings.setAllowFileAccess(true);
            webSettings.setBuiltInZoomControls(true);
            webSettings.setDefaultTextEncodingName("UTF-8");
            //设置WebChromeClient,处理网页中的各种js事件
            wView.setWebChromeClient(new MyWebChromeClient());
            wView.loadUrl("file:///android_asset/demo2.html");
        }
    //这里需要自定义一个类实现WebChromeClient类,并重写三种不同对话框的处理方法
        //分别重写onJsAlert,onJsConfirm,onJsPrompt方法
        class MyWebChromeClient extends WebChromeClient {
            @Override
            public boolean onJsAlert(WebView view, String url, String message,
                                     final JsResult result) {
                //创建一个Builder来显示网页中的对话框
                new Builder(MainActivity.this).setTitle("Alert对话框").setMessage(message)
                        .setPositiveButton("确定", new OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                result.confirm();
                            }
                        }).setCancelable(false).show();
                return true;
            }
    @Override
            public boolean onJsConfirm(WebView view, String url, String message,
                                       final JsResult result) {
                new Builder(MainActivity.this).setTitle("Confirm对话框").setMessage(message)
                        .setPositiveButton("确定", new OnClickListener() {
    @Override
                            public void onClick(DialogInterface dialog, int which) {
                                result.confirm();
                            }
                        })
                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
    @Override
                            public void onClick(DialogInterface dialog, int which) {
                                result.cancel();
                            }
                        }).setCancelable(false).show();
                return true;
            }
    @Override
            public boolean onJsPrompt(WebView view, String url, String message,
                                      String defaultValue, final JsPromptResult result) {
                //①获得一个LayoutInflater对象factory,加载指定布局成相应对象
                final LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
                final View myview = inflater.inflate(R.layout.prompt_view, null);
                //设置TextView对应网页中的提示信息,edit设置来自于网页的默认文字
                ((TextView) myview.findViewById(R.id.text)).setText(message);
                ((EditText) myview.findViewById(R.id.edit)).setText(defaultValue);
                //定义对话框上的确定按钮
                new Builder(MainActivity.this).setTitle("Prompt对话框").setView(myview)
                        .setPositiveButton("确定", new OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                //单击确定后取得输入的值,传给网页处理
                                String value = ((EditText) myview.findViewById(R.id.edit)).getText().toString();
                                result.confirm(value);
                            }
                        })
                        .setNegativeButton("取消", new OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                result.cancel();
                            }
                        }).show();
                return true;
            }
    }
    }

    3.HTML通过JS读取Android联系人并显示

    这段代码的作用,说白了就是用 js 读取 Android 手机上的联系人列表,再把这些联系人展示到 HTML 页面里。页面上如果点中了某个电话号码,就会直接跳转到拨号界面。它的关键点在于:通过 onload() 在网页加载时把对应的 js 脚本一并加载进来,而脚本里会定义好相关函数,用来取出传递过来的对象,读取其中的数据,然后再通过 for 循环按一行一条的方式逐个输出出来。

    运行效果图:

    实现代码:

    往assets文件夹下编写要给demo3.html文件,内容如下:

    
    
        
        显示获取的联系人列表
        
    
    
    
    
    
    用户id 姓名 号码

    再写一个业务类Contact.ja va:

    /**
     * Created by Jay on 2015/9/11 0011.
     */
    public class Contact {
        private String id;
        private String name;
        private String phone;
    public Contact(){}
    public String getId() {
            return id;
        }
    public void setId(String id) {
            this.id = id;
        }
    public String getName() {
            return name;
        }
    public void setName(String name) {
            this.name = name;
        }
    public String getPhone() {
            return phone;
        }
    public void setPhone(String phone) {
            this.phone = phone;
        }
    @Override
        public String toString() {
            return this.id + "~" + this.name + "~" + this.phone;
        }
    }

    再写一个业务类Contact.ja va:

    public class MainActivity extends AppCompatActivity {
    private WebView wView;
    @SuppressLint("Ja vascriptInterface")
        @Override
        protected void onCreate(Bundle sa vedInstanceState) {
            super.onCreate(sa vedInstanceState);
            setContentView(R.layout.activity_main);
            //设置WebView的相关设置,依次是:
            //支持js,不保存表单,不保存密码,不支持缩放
            //同时绑定Ja va对象
            wView = (WebView) findViewById(R.id.wView);
            wView.getSettings().setJa vaScriptEnabled(true);
            wView.getSettings().setSa veFormData(false);
            wView.getSettings().setSa vePassword(false);
            wView.getSettings().setSupportZoom(false);
            wView.getSettings().setDefaultTextEncodingName("UTF-8");
            wView.addJa vascriptInterface(new SharpJS(), "sharp");
            wView.loadUrl("file:///android_asset/demo3.html");
        }
    //自定义一个Js的业务类,传递给JS的对象就是这个,调用时直接ja vascript:sharp.contactlist()
        public class SharpJS {
            public void contactlist() {
                try {
                    System.out.println("contactlist()方法执行了!");
                    String json = buildJson(getContacts());
                    wView.loadUrl("ja vascript:show('" + json + "')");
                } catch (Exception e) {
                    System.out.println("设置数据失败" + e);
                }
            }
    public void call(String phone) {
                System.out.println("call()方法执行了!");
                Intent it = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phone));
                startActivity(it);
            }
        }
    //将获取到的联系人集合写入到JsonObject对象中,再添加到JsonArray数组中
        public String buildJson(List contacts)throws Exception
        {
            JSONArray array = new JSONArray();
            for(Contact contact:contacts)
            {
                JSONObject jsonObject = new JSONObject();
                jsonObject.put("id", contact.getId());
                jsonObject.put("name", contact.getName());
                jsonObject.put("phone", contact.getPhone());
                array.put(jsonObject);
            }
            return array.toString();
        }
    //定义一个获取联系人的方法,返回的是List的数据
        public List getContacts()
        {
            List Contacts = new ArrayList();
            //①查询raw_contacts表获得联系人的id
            ContentResolver resolver = getContentResolver();
            Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
            //查询联系人数据
            Cursor cursor = resolver.query(uri, null, null, null, null);
            while(cursor.moveToNext())
            {
                Contact contact = new Contact();
                //获取联系人姓名,手机号码
                contact.setId(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)));
                contact.setName(cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)));
                contact.setPhone(cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
                Contacts.add(contact);
            }
            cursor.close();
            return Contacts;
        }
    }

    好的,就是那么简单,但是,当你看到效果示意图,我祭出的是我大联想而非N5,就说明了,上述代码 在N5中执行不了,因为在4.4以后addJa vascriptInterface()就不可以用了~至于为什么,我们会在下节课 中对WebView在4.4后的注意事项跟大家说下~

    代码下载:

    WebViewDemo4:下载 WebViewDemo4.zip

    WebViewDemo5:下载 WebViewDemo5.zip

    本节小结:

    好的,本节我们对WebView和Ja vaScrip交互进行了简单的学习,有点意思是吧~,如果你会 HTML + CSS + JS,那么你可以尝试着自己创建一个HTML5端的移动APP试试~本节就说这么多, 谢谢~

    本文内容来源于网友投稿,如有侵权请联系删除。
    作者最新文章
    系统应用
    相关文章 更多
    微软官网下载Win10 64位官方ISO镜像的完整步骤
    微软官网下载Win10 64位官方ISO镜像的完整步骤

    详解如何从微软官网获取纯净的Windows 10 64位ISO镜像文件,包括正确的下载入口、版本与语言选择技巧,以及下载后的完整性校验步骤,确保系统安装源安全可靠。

    Linux如何开启端口号?开放端口命令详解
    Linux如何开启端口号?开放端口命令详解

    详细讲解Linux如何开启端口号以及常用的开放端口命令。

    docker容器自动重启怎么解决 排查原因与修复方法
    docker容器自动重启怎么解决 排查原因与修复方法

    遇到Docker容器频繁自动重启?本文提供从查看容器日志、解读退出代码到配置Restart Policy的完整排查与修复方案,确保服务稳定性。

    Linux设置静态路由命令与永久生效教程
    Linux设置静态路由命令与永久生效教程

    学习如何在Linux中使用命令行添加临时静态路由,并通过修改网络配置文件实现重启后依然有效的永久静态路由设置,涵盖CentOS和Ubuntu的不同配置方法。

    摄像头连接电脑后怎么打开查看实时画面教程
    摄像头连接电脑后怎么打开查看实时画面教程

    摄像头连接电脑后不知如何查看画面?本教程演示如何使用Windows自带的“相机”应用快速调取实时视频流,无需下载额外软件,步骤简单直观,适用于大多数USB及内置摄像头。

    如何在 windows 11 关闭自动关机
    如何在 windows 11 关闭自动关机

    针对 Windows 11 电脑在无人操作时自动关机或重启的问题,本文详解如何通过任务计划程序禁用更新重启任务,并调整电源睡眠策略,从根源解决非预期的自动关机现象。

    电脑摄像头怎么测试人脸识别功能及效果判断方法
    电脑摄像头怎么测试人脸识别功能及效果判断方法

    详细讲解在Windows电脑上测试摄像头人脸识别功能的步骤,包括开启Windows Hello、录入面部数据、不同环境下的效果验证及常见问题排查,帮助用户确认设备兼容性与识别准确率。

    docker 容器无法启动的配置检查命令及排查方法
    docker 容器无法启动的配置检查命令及排查方法

    当 Docker 容器启动后立即退出时,不要盲目重启。本文详解如何通过 docker logs 查看标准输出错误,利用 docker inspect 检查挂载与网络配置,并修正入口点脚本权限问题,提供一套高效的因果排查流程。

    安卓手机投屏到电脑win10怎么设置教程
    安卓手机投屏到电脑win10怎么设置教程

    详解如何利用Windows 10自带功能将安卓手机画面投射至电脑屏幕,涵盖开启步骤、连接技巧及延迟分析,适合临时演示与多屏协作场景。

    移动硬盘解除加密怎么操作?详细步骤教程
    移动硬盘解除加密怎么操作?详细步骤教程

    详细介绍如何在Windows系统中为移动硬盘解除BitLocker加密,包括解锁驱动器、关闭加密功能及监控解密进度的完整操作流程,帮助用户安全移除数据保护。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    macOS软件
    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    Mac软件 更多
    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

    灵活计算器
    灵活计算器
    macOS/iOS/Android

    灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

    WINDOWS 更多
    3dmax(3ds max)
    3dmax(3ds max)
    Windows

    Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。