首页 > 编程语言 >【妙用WebView】鸿蒙元服务中如何使用Java Script的API创建地图

【妙用WebView】鸿蒙元服务中如何使用Java Script的API创建地图

时间:2023-04-03 10:47:18浏览次数:36  
标签:Java Script 地图 innhtml JS API WebView webView

【关键字】

webview 地图 高德 腾讯地图 百度地图

 

【问题背景】

开发元服务过程中需要用到地图能力:卡片中显示我的快递位置和我的位置信息;PageAbility中可以打开自定义地图,查询POI点,做路径规划、路径推荐等;查看了高德、百度、华为、腾信地图的后发现,各大厂商对鸿蒙系统的支持能力参差不齐,都没有提供鸿蒙可用的SDK;于是考虑使用JS API的方式。最初思路被局限在通过鸿蒙的JS 集成地图的JS API,但是最终被各种报错折磨到放弃。

无意中发现WebView这个好东西,他不仅仅是一个view组件,还是可以让我们调用JS的各种方法;

 

【准备工作】

参照地图厂商的JS API开发指导,申请地图key(这里以高德为例);

cke_382.png

 

【实现过程】

下面就看下如果通过WebView实现地图能力:

  1. 参照WebView组件初始化指导,千万不要跳过,认真看完指导

    https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ui-java-component-webview-0000001092715158

    关键步骤一:配置应用的网络权限(没有网你还想调JS API)。

    打开“entry > src > main > config.json”,并添加如下配置。

    "module": {
    "reqPermissions": [
      {
        "name": "ohos.permission.INTERNET"
      }]
    }
  2. 新建资源文件:

    cke_20957.png

    资源类型选择:Layout

    cke_27044.png

    布局文件内容中定义地图组件:

    <?xml version="1.0" encoding="utf-8"?>
    <DirectionalLayout
        xmlns:ohos="http://schemas.huawei.com/res/ohos"
        ohos:height="match_parent"
        ohos:width="match_parent"
        ohos:orientation="vertical">
            <ohos.agp.components.webengine.WebView
                ohos:id="$+id:ability_main_webview"
                ohos:height="600vp"
                ohos:width="match_parent"
                ohos:weight="1"/>
            <Text
                ohos:height="150vp"
                ohos:width="match_parent"
                ohos:text="hello map">
            </Text>
    </DirectionalLayout>
  3. 我这边主体页面都是用的JS类Web开发范式开发的,所以需要从JS页面跳转到JAVA页面;使用了一下startAbility跳转到mapAbility。

    新建mapAbility

    cke_37325.png

    cke_40663.png

    Intent intent = new Intent();
    Operation operation = new Intent.OperationBuilder()
            .withBundleName("com.huawei.testjsmap.hmservice")
            .withAbilityName("com.huawei.testjsmap.mapAbility")
            .build();
    intent.setOperation(operation);
    startAbility(intent);
  4. 关键步骤二:Webview调用JS API

    1)允许Webview执行Java Script:webView.getWebConfig().setJavaScriptPermit(true);

    2)加载一个空页面: webView.load("about:blank"); 不要问为什么,问就是没有页面执行个锤子的script。

    3)加载组件:String innhtml="document.getElementsByTagName('html')[0].innerHTML='"+mapbody+"';";

    4)通过document.body.appendChild加载script;直接用innerHTML赋值会导致script加载失败;

    完整代码如下:

    private String mapbody = "<head><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"initial-scale=1.0, user-scalable=no, width=device-width\"><link rel=\"stylesheet\" href=\"https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css\"/><text id=\"maptitle\">地图显示</text><button onclick=\"a()\">try</button><style>html,body,#container {width: 100%;height: 100%;}</style></head><body ><div id=\"container\"></div></body>";
    private String mapfun ="function a(){ document.getElementById(\"maptitle\").innerHTML = \"我的一段 JavaScript代码\";     var map = new AMap.Map(\"container\", { viewMode: \"2D\",zoom:11,center: [116.397428, 39.90923]})};";
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_map_main);
        WebView webView = (WebView) findComponentById(ResourceTable.Id_ability_main_webview);
        webView.getWebConfig().setJavaScriptPermit(true);
        webView.setWebAgent(new WebAgent() {
            @Override
            public void onPageLoaded(WebView webView, String url) {
                String innhtml="document.getElementsByTagName('html')[0].innerHTML='"+mapbody+"';";
                innhtml += "var newscript = document.createElement(\"script\");" ;
                innhtml += " newscript.src=\"https://webapi.amap.com/maps?v=2.0&key=准备工作中申请的地图KEY\";";
                innhtml += "document.body.appendChild(newscript);";
                innhtml += "var functionscript = document.createElement(\"script\");" ;
                innhtml += " functionscript.innerHTML='"+mapfun +"';";
                innhtml += "document.body.appendChild(functionscript);";
                System.out.println("onPageLoaded start:"+innhtml);
                webView.executeJs(innhtml,null);            }
        });
        webView.load("about:blank");

     

看到这里已经无需多言了,剩下的要在地图上实现哪些业务就看地图JS API能支持哪些能力了。

最后安利一个鸿蒙webview的调试方法

调试开关打开:MainAbility的onstart方法中执行

public void onStart(Intent intent) {
    super.onStart(intent);
    try {
        Class web =  Class.forName("android.webkit.WebView");
        if(web != null){
            Method method = web.getMethod("setWebContentsDebuggingEnabled",boolean.class);
            method.invoke(web,true);
        }
    } catch (ClassNotFoundException | NoSuchMethodException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}

调试工具使用:大家可以自己去百度下webview调试工具,其使用方法一致的。

 

 欲了解更多更全技术文章,欢迎访问https://developer.huawei.com/consumer/cn/forum/?ha_source=zzh

标签:Java,Script,地图,innhtml,JS,API,WebView,webView
From: https://www.cnblogs.com/developer-huawei/p/17282335.html

相关文章

  • java不等于 等于
    起因:两个一样得String串对比 !=时返回false。 1、如 Stringstr="";Stringstr2=""; 则 str==str2 str!=str2  均返回结果不正确正确用法  str.Equals(str2) 或!str.Equals(str2); 2、在String使用前要做为null判断。写法:!"".Equals(str)&&str......
  • 重学Java设计模式-结构型模式-代理模式
    重学Java设计模式-结构型模式-代理模式内容摘自:https://bugstack.cn/md/develop/design-pattern/2020-06-16-重学Java设计模式《实战代理模式》.html#重学-java-设计模式-实战代理模式「模拟mybatis-spring中定义dao接口-使用代理类方式操作数据库原理实现场景」代理模式介绍......
  • java 启动错误idea 不报错误
    penapi.actionSystem.impl.Utils-updatefailedforAnAction(com.intellij.execution.ExecutorRegistryImpl$ExecutorAction)withID=MyBatisLogPluginjava.lang.IllegalStateException:@NotNul在项目拉取启动的时候就报出了这个错误首先查看idea的日志到底是什么报错 ......
  • Java 序列化详解
    XML和JSON是两种经常在网络使用的数据表示格式,这里我们介绍如何使用Java读写XML和JSON。 一、XML概述1、XML简介我们都知道对象是不能在网络中直接传输的,不过还有补救的办法。XML(ExtensibleMarkupLanguage)可扩展标记语言,本身就被设计用来存储数据,任何一个对象都可以用XML来描......
  • 【Java 并发】【synchronized】【一】synchronized底层是怎么通过monitor进行加锁的
    1 前言之前我们说过对象头的信息,这节我们就来看看synchronized是怎么通过monitor进行重量级加锁。2 内容回顾我们先来回顾下MarkWord的内容:当MarkWord的最后两位的锁标志位是10的时候,MarkWord这哥们说自己处于重量级锁的模式,重量级加锁不是它的责任,是monitor的责任。......
  • Java Checked Exception 的是与非
    结论JavaCheckedException是一个设计错误,初衷很美好,现实很糟糕。设计的初衷把方法可能抛出的异常,显示地声明在方法定义中,比如FileInputStream的构造函数可能会抛出FileNotFoundException:publicFileInputStream(Stringname)throwsFileNotFoundException{this(name......
  • JAVA - IO 流
    FileInputStreamimportjava.io.FileOutputStream;importjava.io.IOException;publicclassFileOutPutStreamDemo{/*FileOutputStream使用细节:1.write方法写出的数字:是ASCCI表中字符对应的数字,因此a=>972.创建FileOutputStream对象时“E:\java......
  • Java学习笔记14
    1.Arrays类​ Arrays类包含用于操作数组的各种方法(如排序和搜索)。该类没有构造函数,直接使用类名.方法名()的方法调用需要的方法。常用方法方法作用publicstaticStringtoString(数组)把数组拼接成一个字符串publicstaticintbinarySearch(数组,查找的元素)二......
  • 从 JDK 9 到 19,认识一个新的 Java 形态(内存篇)
    前言在JDK9之前,Java基本上平均每三年出一个版本。但是自从2017年9月份推出JDK9到现在,Java开始了疯狂更新的模式,基本上保持了每年两个大版本的节奏。从2017年至今,已经发布了一个版本到了JDK19。其中包括了两个LTS版本(JDK11与JDK17)。除了版本更新节奏明显加快之......
  • JNDI(Java Naming and Directory Interface–Java命名和目录接口)
    JNDI(JavaNamingandDirectoryInterface,Java命名和目录接口)为应用程序提供了一种通过网络访问远程服务的方式。本节我们学习如何通过JNDIAPI注册和访问JDBC数据源对象。读者如果需要了解更多JNDI相关细节,则可参考JNDI规范文档。JNDIAPI的命名服务可以把一个逻辑名称和一个具......