首页 > 其他分享 >鸿蒙星空的太白星 | WebView给元服务调用JS API指明方向

鸿蒙星空的太白星 | WebView给元服务调用JS API指明方向

时间:2023-06-27 21:25:19浏览次数:58  
标签:Java 地图 JS API WebView 页面

​漆黑深夜夜凉如水,繁星盛开于无垠苍穹。清风徐来,一片薄云,夜空顿然失色,有些阴霾。天空中最亮的星,太白星,在薄云中依然闪耀,如同海上迷雾中的灯塔,为迷失方向的船只指明方向。

 

元服务是华为提供的一种面向未来的服务形态,具有独立入口和免安装等特性,支持运行在1+8+N设备上。在万物互联时代,提供了更丰富的入口、更智能的分发、更高效的转化,助力开发者快速抢占流量入口。

景区类型的元服务如果实现一键购票、游览路线推荐、智慧导览、智慧商店等,将大大提升旅客的兴致来自主游览。开发此类元服务过程中通常需要用到地图功能,例如在景区类型元服务的卡片中显示我的位置信息,通过推荐路线提供景区最佳游览路线。通常思路是PageAbility打开自定义地图,查询地图信息(POI)点,做路径规划、路径推荐等。通过卡片中内置导航功能,在景区内帮用户贴心的避开人从众。

cke_157629.png

 

想法是美好的,现实是骨感的。查阅了高德、百度、华为、腾讯地图能力的后发现,各大厂商对鸿蒙系统的支持能力参差不齐,都没有提供鸿蒙可用的SDK。商用APP的主体页面通常都是JS类的WEB页面,于是一直琢磨如何使用JS API的方式。最初的思路被局限在通过鸿蒙的JS集成地图的JS API来实现,但是最终被各种报错而折磨不堪。秉着只要思想不滑坡,方法总比问题多,冥冥中看到了鸿蒙漆黑星空中那颗最亮的星,Java UI组件之太白星WebView。

WebView组件灯塔般的星光一闪,解决问题的思路灵感乍现。立刻想到了JS类WEB页面通过startAbility跳转到mapAbility,来实现JS页面跳转到Java页面的逻辑。在mapAbility中开发地图页面,妙用Java UI框架中的Webview组件来加载本地Html文件,即可使用Html调用地图JS API接口。

 

敲黑板,画重点,关键几步听我娓娓道来。

 

1.准备地图的key。

参考地图厂商的JS API开发指导,申请地图的key,这里以高德地图为例说明。

cke_167348.png

2.完成WebView组件的初始化。

请认真参考WebView组件文档完成,千万不要跳过。

其中最关键的就是配置应用的网络权限,如果网络权限不对,还想调通JS API,那就等于是奢望。

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

"module": {

"reqPermissions": [

  {

    "name": "ohos.permission.INTERNET"

  }]

}

3.新建资源文件。

cke_251113.png

“资源类型”请选择“Layout”。

cke_261053.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>

4.针对JS类Web开发范式开发的主体页面,使用startAbility跳转到mapAbility,实现从JS页面跳转到Java页面。

说明开发UI的程序员习惯用JS,所以主体页面通常都是JS的。WebView组件是Java的,所以需要从JS页面跳转到Java页面。

新建mapAbility

cke_271217.png

cke_278926.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);

5.在mapAbility中开发地图页面,Webview加载本地Html文件来调用地图JS API接口。

说明:Java代码开发请参考Java UI框架文档

在资源文件“resources/rawfile”目录下增加map.html文件,参考地图JS开发指导编写Html文件。

cke_285307.png

示例代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>创建地图</title>
</head>
<script charset="utf-8" src="https://map.qq.com/api/gljs?v=1.exp&key=准备工作中申请的地图KEY"></script>
<style type="text/css">
    html,
    body {
        height: 100%;
        margin: 0px;
        padding: 0px;
    }
    #container {
        width: 100%;
        height: 100%;
    }
</style>
<body onl oad="initMap()">
<div id="container"></div>
<script type="text/javascript">
        function initMap() {
            var center = new TMap.LatLng(39.984104, 116.307503);
            //初始化地图
            var map = new TMap.Map("container", {
                rotation: 20,//设置地图旋转角度
                pitch:30, //设置俯仰角度(0~45)
                zoom:12,//设置地图缩放级别
                center: center//设置地图中心点坐标
            });
        }
    </script>
</body>
</html>

mapAbilityonstart方法中直接通过mapview.load打开一个拼装的URI地址: webView.load("https://example.com/rawfile/map.html");

 

至此问题的迷雾已破开,薄云消散,原本有些阴霾的苍穹,星光璀璨。鸿蒙星空恍若一个巨大的舞台,星有多大,舞台就有多大。剩下的要在元服务中实现哪些业务就看对应地图厂商JS API能力了。

 

一颗“彩蛋”流星划破天空。

“彩蛋”流星之本地调试技巧:

webAgent中通过复写processResourceRequest的方式实现本地文件加载,这种方式可以直接通过IDE工具打开Html页面进行调试,调试JS API的效率大大提升。

示例代码如下:

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 ResourceResponse processResourceRequest(WebView webview, ResourceRequest request) {
            final String authority = "example.com";
            final String rawFile = "/rawfile/";
            Uri requestUri = request.getRequestUrl();
            if (authority.equals(requestUri.getDecodedAuthority())) {
                String path = requestUri.getDecodedPath();
                if (TextTool.isNullOrEmpty(path)) {
                    return super.processResourceRequest(webview, request);
                }
                if (path.startsWith(rawFile)) {
                    // 根据自定义规则访问资源文件
                    String rawFilePath = "entry/resources/rawfile/" + path.replace(rawFile, "");
                    String mimeType = URLConnection.guessContentTypeFromName(rawFilePath);
                    try {
                        Resource resource = getResourceManager().getRawFileEntry(rawFilePath).openRawFile();
                        ResourceResponse response = new ResourceResponse(mimeType, resource, null);
                        return response;
                    } catch (IOException e) {
                        HiLog.info(TAG, "open raw file failed");
                    }
                }
            }
            return super.processResourceRequest(webview, request);
        }
    });
    webView.load("https://example.com/rawfile/map.html");
}

标签:Java,地图,JS,API,WebView,页面
From: https://www.cnblogs.com/mayism123/p/17509935.html

相关文章

  • 全栈测试开发系列----WebDriver API及对象识别技术(一)
    前言:WebDriverAPI相比于之前的selenium-RCAPI而言,不仅解决了一些相关的限制,还使得接口更加简洁,同时更好的支持了页面本身不重新加载而页面元素发生变化的动态网页,所以WebDriverAPI的实现目的不仅是提供一个良好的面向对象API,而且对Web应用程序测试过程中所产生的问题......
  • gojs禁止画布滚动 完全只读方案
    gojs生成画布后,鼠标滚动,画布的内容会上下移动,以下属性可解决此问题。myDiagram=$(go.Diagram,"graph",{initialContentAlignment:go.Spot.Center,//启动视口中间的所有内容"toolManager.mouseWheelBehavior":go.ToolManager......
  • java让一个api延迟执行
    Java中可以使用以下方式延迟执行一个API:1.使用Thread.sleep方法:可以通过让当前线程休眠一段时间来实现延迟执行。例如,以下代码会让当前线程休眠5秒钟,然后再执行指定的API方法。 Thread.sleep(5000);}catch(InterruptedExceptione){e.printStackTrace();}//执......
  • JAVA的动态性之脚本语言支持API
    JAVA语言是一种静态类型的编程语言。静态类型的含义是指在编译的时候进行类型检查。JAVA源代码中的每个每个变量的类型都需要显式地进行声明。所有的变量、方法的参数和返回值的类型在程序运行之前就必须是已知的。JAVA语言的这种静态类型特性使编译器可以在编译的时候执行大量的检......
  • 菜鸟学习Spring——SpringMVC注解版解析不同格式的JSON串
    一、概述    不同格式的JSON串传到后台来实现功能这个是我们经常要做的一件事,本篇博客就给大家介绍四种不同的JSON串传到后台后台如何用@RequestBody解析这些不同格式的JSON串的。二、代码展示需要引用的jar包1.xml配置  Web.xml1.<?xmlversion="1.0"encoding="UTF-8......
  • PHP语言对接抖音快手小红书视频/图片去水印API接口的案例
    这篇文章主要介绍了PHP语言对接抖音快手小红书视频/图片去水印API接口的案例,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。以下为PHP语言调用去水印接口的示例,展示GET请求方式的调用方式。示例代码中用到的Uid和Toke......
  • 记录--Threejs-着色器实现一个水波纹
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助hree.js是一个基于WebGL的JavaScript3D库,用于创建和渲染3D图形场景。一、图像渲染过程1、webGLwebGL:WebGL是一种基于JavaScriptAPI的图形库,它允许在浏览器中进行高性能的3D图形渲染。webGL的......
  • 如何在.net6webapi中记录每次接口请求的日志
    为什么在软件设计中一定要有日志系统?在软件设计中日志模块是必不可少的一部分,可以帮助开发人员更好的了解程序的运行情况,提高软件的可靠性,安全性和性能,日志通常能帮我们解决如下问题:调试和故障排查:日志可以记录程序运行时的各种信息,包括错误,异常,警告等,方便开发人员在出现问题时......
  • 【lazada接口系列】获得lazada商品详情API接口采集商品规格信息调用示例
    ​Lazada商品详情API接口的作用是获取Lazada电商平台上的某一商品的详情信息,包括商品的名称、销售价格、库存数量、图片、商品描述、品牌、产地、售后保障等信息。开发者可以使用该API接口获取到商品的原始数据,进行分析、筛选等操作。通过该接口获取到的商品详情数据可以结合其......
  • P4630 [APIO2018] 铁人两项 题解
    一、题目描述:给你一个$n$个点,$m$条边的无向图。图不一定联通求出点对$(u,c,v)$的数量,使得点$u$存在一条经过点$c$到达点$v$的无向图。数据范围:$1\len\le1\times10^5,1\lem\le2\times10^5$ 二、解题思路:算是圆方树比较模板的题了......