一个帖子教你实现 商品下单、获取商品订单信息、商品送货时发送通知 一体化功能

news2025/1/20 6:01:03

1、介绍

总览

通过无缝数据库结构,在保证数据的可用性、一致性、安全性外,云数据库能够实现数据在客户端和云端之间的无缝同步。云函数提供serverless环境,AppGallery Connect的其他服务为云函数提供事件源。监听事件源可以触发相关函数。

您将建立什么

在本次codelab中,您将建立一个示例项目用于体验云数据库和云函数。云数据库中数据发生变化时,云函数HTTP触发器触发函数发送通知。流程如下:

  • 商品下单。

  • 获取商品订单信息。

  • 商品送货时,发送通知。

您将学会什么

在本次codelab中,您将学习:

  • 如何在AppGallery Connect中创建项目和新建应用。

  • 如何集成云数据库和云函数。

  • 如何使用云函数并且使用HTTP触发器发送通知。

2、您需要什么

硬件需求

  • 一台笔记本或台式电脑。

  • 一部装有EMUI 8.0或以上版本的华为手机,运行HMS Core (APK) 5.0.1.301或以上版本;或一部装有安卓7.0或以上版本的非华为手机,运行HMS Core (APK) 5.0.1.301或以上版本。该手机用于demo的运行和调测。

软件需求

  • JDK版本:1.8或以上

  • Android Studio版本:3.X或以上

  • SDK平台版本:24或以上

  • targetSdkVersion:29

  • compileSdkVersion:29

  • Gradle版本:4.6或以上

必备知识

安卓应用开发基础知识

3、能力接入准备

集成前,需要完成以下准备工作:

在进行准备前,请先注册开发者帐号。

  • 在AppGallery Connect中创建项目和应用。

  • 创建Android Studio项目。

  • 生成签名证书。

  • 生成签名证书指纹。

  • 在AppGallery Connect中将签名指纹添加到应用中。

  • 添加必要配置。

  • 配置项目签名。

  • 同步项目。

详情请参见HUAWEI HMS Core集成准备。

4、集成HMS Core SDK

添加您应用的AppGallery Connect配置文件

  1. 登录AppGallery Connect,点击“我的项目”,在项目列表中找到并点击您的项目。

  2. 在“项目设置”页面选择“常规”页签。

  3. 在“项目”区域下点击“数据处理位置”后的“启用”。

    cke_15201.png

  4. 点击“应用”区域的“agconnect-services.json”下载配置文件。

    cke_20802.png

  5. 把agconnect-services.json文件拷贝到项目的应用级根目录下。

    cke_24432.png

添加编译依赖

  1. 打开应用级的“build.gradle”文件。

  2. 在dependencies中添加如下编译依赖。

    dependencies { 
        //添加云函数和云数据库依赖。
        implementation 'com.huawei.agconnect:agconnect-cloud-database:{version}'
        implementation 'com.huawei.agconnect:agconnect-function-ktx:{version}'
    }

    注意:

    将{version}替换为云数据库的最新版本号,例如,com.huawei.agconnect:agconnect-cloud-database:1.5.3.300。最新的版本号请参见SDK版本更新说明。

    将{version}替换为云函数的最新版本号,例如,com.huawei.agconnect:agconnect-function-ktx 1.7.1.300。最新的版本号请参见SDK版本更新说明

  3. 在build.gradle文件中,设置Java源代码的兼容性模式。

    compileOptions { 
    sourceCompatibility = 1.8 
    targetCompatibility = 1.8
    }
  4. 在应用级build.gradle文件中设置minSdkVersion。

    android {
     ... 
       defaultConfig {
          ... 
       minSdkVersion 26 
          ... 
      }
       ... 
    }
  5. 检查是否已添加AppGallery Connect插件。如没有,在应用级build.gradle文件中添加该插件。

    apply plugin: 'com.huawei.agconnect'

配置混淆脚本

编译APK前需要配置混淆脚本,避免混淆HMS Core SDK。如果出现混淆,HMS Core SDK可能无法正常工作。

Android Studio开发环境里的混淆脚本是“proguard-rules.pro”。

  1. 加入排除HMS SDK的混淆配置。

    -ignorewarnings 
    -keepattributes *Annotation* 
    -keepattributes Exceptions 
    -keepattributes InnerClasses 
    -keepattributes Signature 
    -keepattributes SourceFile,LineNumberTable 
    -keep class com.huawei.hianalytics.**{*;} 
    -keep class com.huawei.updatesdk.**{*;} 
    -keep class com.huawei.hms.**{*;}

5、设计UI

cke_98012.png

cke_102491.png

cke_107423.png

cke_112656.png

cke_116239.png

6、集成云函数

  1. 需要在handler.js文件中写入发送通知的函数。

  2. 在AppGallery Connect中创建函数。

  3. 输入函数名,上传创建的handler.js文件,并保存设置。

  4. 函数创建完成后,添加HTTP触发器。

7、初始化云数据库

  1. 初始化云数据库。

    override suspend fun initialize(): Result<Unit> {
            handler = CompletableDeferred()
            AGConnectCloudDB.initialize(context)
            initializeCloudDB()
            initializeZone()
            handler?.let { return it.await() }
                ?: run { return Result.Error() }
        }
    
        private fun initializeCloudDB() {
            val instance = AGConnectInstance.buildInstance(
                AGConnectOptionsBuilder().setRoutePolicy(
                    AGCRoutePolicy.GERMANY
                ).build(context)
            )
            mCloudDB = AGConnectCloudDB.getInstance(instance, AGConnectAuth.getInstance())
            mCloudDB.createObjectType(ObjectTypeInfoHelper.getObjectTypeInfo())
        }
    
    
    
    private fun initializeZone() {
            val mConfig = CloudDBZoneConfig(
                "CourierDbZone", 
                CloudDBZoneConfig.CloudDBZoneSyncProperty.CLOUDDBZONE_CLOUD_CACHE,
                CloudDBZoneConfig.CloudDBZoneAccessProperty.CLOUDDBZONE_PUBLIC
            )
            mConfig.persistenceEnabled = true
            val task = mCloudDB.openCloudDBZone2(mConfig, true)
            task.addOnSuccessListener {
                cloudDBZone = it
                handler?.complete(Result.Success(Unit))
            }.addOnFailureListener {
                handler?.complete(Result.Error(it.message))
            }
        }
  2. 产品列表由云数据库提供。用户在产品列表中选择某个产品时,售卖该产品的商店的经纬度发送到快递员的界面上。

    override suspend fun getOrders(): List<Order> {
            val result = CompletableDeferred<List<Order>>()
            cloudDBZone?.let { dbZone ->
                dbZone.executeQuery(
                    CloudDBZoneQuery.where(Order::class.java),
                    CloudDBZoneQuery.CloudDBZoneQueryPolicy.POLICY_QUERY_DEFAULT
                ).addOnCompleteListener{
                    if(it.isSuccessful) {
                        val cursor = it.result.snapshotObjects
                        val orders = mutableListOf<Order>()
                        while(cursor.hasNext()) {
                            orders.add(cursor.next())
                        }
                        result.complete(orders)
                    }else {
                        throw it.exception
                    }
                }
            }?: run {
                throw Exception("Cloud DB not initialized.")
            }
            return result.await()
        }

8、使用Location和Directions API

  1. 查看权限。

    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  2. 在Android Studio页面,选择File > Sync Project with Gradle Files同步项目。

  3. 根据用户位置信息,通过Directions API创建路径。

    private fun getLastLocation() {
            val mLocationRequest = LocationRequest()
            mLocationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
            mLocationRequest.numUpdates = 1
            fusedLocationProviderClient.requestLocationUpdates(
                mLocationRequest,
                mLocationCallback,
                Looper.getMainLooper()
            )
    }
    private val mLocationCallback = object : LocationCallback() {
            override fun onLocationResult(locationResult: LocationResult) {
                courierTrackingViewModel.createRoute(
                    args.storeLocation,
                    locationResult.lastLocation,
                    DirectionType.DRIVING
                )
            }
        }
    @POST("{type}")
        suspend fun getDirections(
            @Path(value = "type",encoded = true) type : String,
            @Body directionRequest: DirectionsRequest,
            @Query("key") api_key: String,
        ): DirectionsNetwork
  4. 当Directions API返回成功结果后,标记用户和商店位置。

    private fun addMarker(latLng: LatLng, title: String, icon: Int): Marker? {
            val options = MarkerOptions()
                .position(latLng)
                .title(title)
                .icon(BitmapDescriptorFactory.fromResource(icon))
            return hMap?.addMarker(options)
        }
  5. 在地图上,用折现添加Directions API返回的经纬度信息。

    private fun addPolylines(route: Route) {
            route.pathPoints?.let { pathPoints ->
                val options = PolylineOptions()
                pathPoints.forEach { latLng ->
                    options.add(latLng)
                }
                options.color(
                    ContextCompat.getColor(
                        requireContext(), R.color.yellow_700
                    )
                )
                options.width(5f)
                hMap?.addPolyline(options)
            }
    }

9、HTTP触发器场景

您可以指定云函数的HTTP触发器给用户发送消息,通知他们快递员已到达。用户可以在地图上查看订单位置。

private suspend fun starSimulation(pathPoints: List<LatLng>?) {
        var marker: Marker?
        pathPoints?.let { paths ->
            paths.forEach { latLng ->
                marker = addMarker(latLng,"Courier",R.drawable.scooter_icon_128)
                animateCamera(latLng)
                delay(100)
                marker?.remove()
            }
        }
        sendNotification()
    }
    private fun sendNotification() {
        val pushToken = activity?.getSharedPreferences(
            "device_token", Context.MODE_PRIVATE
        )?.getString("device_token",null)
        pushToken?.let { token ->
            val parameterMap: HashMap<String, String> = HashMap()
            parameterMap["deviceToken"] = token
            AGConnectFunction.getInstance()
                .wrap("courier-tracking-notification-\$latest")  
                .call(parameterMap)}
         findNavController().popBackStack()}

10、恭喜您

祝贺您,您已经成功完成本codelab并学到了:

  • 如何继承云数据库和云函数。

  • 如何通过HTTP触发器发送通知。

11、参考文件

  • 云数据库开发指南

  • 云函数开发指南

  • 云函数HTTP触发器

  • Push Kit开发指南

  • Map Kit开发指南

  • Location Kit开发指南

  • Directions API开发指南

您可以下载源代码。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/84664.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Word处理控件Aspose.Words功能演示:使用 C++ 将 PowerPoint 演示文稿转换为 Word 文档

Aspose API 支持旗下产品覆盖文档、图表、PDF、条码、OCR、CAD、HTML、电子邮件等各个文档管理领域&#xff0c;为全球.NET 、Java、C 等10余种平台开发人员提供丰富的开发选择。 在某些情况下&#xff0c;您有一个 PowerPoint 演示文稿并想要创建一个详细描述其内容的文档。为…

[附源码]Python计算机毕业设计电影院购票系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

小米手机系统好牛,真是国产系统的佼佼者

在十多年前智能手机&#xff0c;基本就没有定制、优化系统的概念&#xff0c;手机的图标都巨丑无比&#xff0c;而且还有好多不root都卸载不掉。当时买了一部漂亮国的某想手机&#xff0c;光预装应用就占了94%的空间&#xff0c;内容倒是特别“全面”&#xff0c;什么看小说的、…

“1只老母鸡”估值180亿!老乡鸡发展20年,都做对了什么?

酝酿了两年之久后&#xff0c;合肥终于迎来了养鸡IPO&#xff0c;估值180亿。 发迹于安徽、对标肯德基、麦当劳的老乡鸡餐饮股份有限公司更新了招股书&#xff0c;再度冲刺“中式快餐第一股”。 老乡鸡脱胎于2013年成立的“肥西老母鸡”&#xff0c;虽然已经走过了近二十个年头…

react源码中的生命周期和事件系统

这一章我想跟大家探讨的是React的生命周期与事件系统。 jsx的编译结果 因为前面也讲到jsx在v17中的编译结果&#xff0c;除了标签名&#xff0c;其他的挂在标签上的属性&#xff08;比如class&#xff09;&#xff0c;事件&#xff08;比如click事件&#xff09;&#xff0c;都…

《Python多人游戏项目实战》第一节 简单的方块移动

目录 1.1 设置游戏窗口 1.2 绘制一个方块 1.3 编写服务端代码 1.4 完善客户端代码 1.5 完整代码下载地址 在本节&#xff0c;我们将通过一个简单的方块移动程序进入多人联机游戏的大门。每个玩家打开游戏窗口后都可以控制一个方块&#xff0c;当某个玩移动方块后&#xff…

面试八股-Java并发

1.线程 和进程区别&#xff1a; 进程&#xff1a;独立地址空间 代码、数据、堆栈 资源分配基本单位线程&#xff1a;共享地址空间 线程ID、指令指针、寄存器集合和堆栈 调度分派基本单位 1.1.使用 实现Runable接口&#xff0c;run方法为实际逻辑实现Callable接口&#xff0…

离散数学与组合数学-数理逻辑-02谓词演算及其形式系统

文章目录第二章 谓词演算及其形式系统2.1 个体谓词和量词2.1.1 个体谓词演算永真式谓词公式的前束范式一阶谓词演算形式系统谓词逻辑的等值演算与推理第二章 谓词演算及其形式系统 2.1 个体谓词和量词 2.1.1 个体 个体常元(constants):确定的个体用a,b,ca,b,ca,b,c等小写字母…

羟基聚乙二醇叠氮 HO-PEG-N3/Azide的结构式

羟基聚乙二醇叠氮(HO-PEG-N3)是异双功能PEG衍生物之一。叠氮化物在铜离子催化的水溶液中与炔基有效反应。炔烃和叠氮化物之间的1,3-偶极环加成反应是一种高产率的点击化学反应&#xff0c;可实现两个相应分子的高效结合。叠氮化物也可以与应变促进的环辛炔反应&#xff0c;不需…

Pr:使用作品

利用作品 Production&#xff0c;可将大型复杂工作流拆分为多个可管理的 Pr 项目&#xff0c;并可在作品内跨项目、跨平台&#xff08;macOS 和 Windows&#xff09;引用媒体&#xff0c;无论这些资源是在本地存储或是共享的网络存储&#xff0c;作品可让一切保持同步。作品&am…

真希望你也明白runtime.Map和sync.Map

Map 官方介绍 One of the most useful data structures in computer science is the hash table. Many hash table implementations exist with varying properties, but in general they offer fast lookups, adds, and deletes. Go provides a built-in map type that imple…

Grafana监控大屏配置参数介绍(二)

Grafana 系列文章&#xff0c;版本&#xff1a;OOS v9.3.1 Grafana 的介绍和安装Grafana监控大屏配置参数介绍&#xff08;一&#xff09;Grafana监控大屏配置参数介绍&#xff08;二&#xff09; 上一篇文章已经介绍了图表可视化配置部分的 Panel options、Tooltip、Legend 3类…

音视频行业大势如何,优势在哪?

电信行业的变革&#xff1a; 从1G语音、2G短信、3G图片语音、4G视频到5G未来可期的新时代&#xff0c;见证了音视频行业的磅礴发展。 技术更新慢且门槛高 技术更新慢&#xff0c;技术门槛高&#xff0c;大部分技术沿用至今&#xff0c;依然保持生命力&#xff0c;技术人员成型…

http协议和websocket协议

http协议 HTTP 即超文本传输协议&#xff0c;是一种获取网络资源 (例如图像、HTML 文档) 的应用层协议&#xff0c;它是互联网数据通信的基础&#xff0c;由请求和响应构成。通常&#xff0c;首先客户端会发送 HTTP 请求(在请求报文中会指定资源的 URL)&#xff0c;然后用传输…

DocArray 0.20.0 发布!新增 Milvus 后端支持,更好地嵌套数据搜索,新增 RGB-D 格式的 3D 模型表示...

DocArray 是一个用于处理、传输和存储多模态数据的 Python 工具包。DocArray 提供便捷的多模态数据处理功能&#xff0c;具备基于 Protobuf 提供高性能的网络传输性能&#xff0c;同时也为多种向量存储方案提供统一的 API 接口。GitHub&#xff1a;github.com/docarray/docarra…

AU如何为你的人声增加空旷感?

你知道怎么使用AU给你的声音添加延迟效果&#xff0c;让你的声音具有空旷感和弱回声的效果。在这里我们可以使用插件达到这个目的。 在使用模拟延迟插件之前呢&#xff0c;我们可以去创建一个立体声总音轨&#xff0c;创建方式如图&#xff0c;跟着序号走&#xff0c;我们就可以…

CSS -- 06. CSS高阶技巧总结

文章目录CSS高阶技巧1 精灵图(sprites)1.1 为什么使用精灵图1.2 精灵图的使用2 字体图标2.1 字体图标的产生2.2 字体图标的优点2.3 字体图标的下载2.4 字体图标的引入2.5 字体图标的追加3 CSS三角形4 CSS用户界面样式4.1 鼠标样式 cursor4.2 表单的轮廓线4.3 防止拖拽文本域 re…

JAVA毕业设计——基于Springboot+vue的心理咨询管理系统(源代码+数据库)

github代码地址 https://github.com/ynwynw/psychlolgyhealth-public 毕业设计所有选题地址 https://github.com/ynwynw/allProject 基于Springbootvue的心理咨询管理系统(源代码数据库) 一、系统介绍 本项目分为管理员与普通用户两种角色 管理员角色包含以下功能&#xff…

[附源码]Python计算机毕业设计SSM基于Web美食网站设计(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Kotlin标准库函数

Kotlin标准库中包含了几个函数&#xff0c;它们的目的就是可以在对象的上下文中执行代码块。当我们调用该Lambda表达式时&#xff0c;它会形成一个临时的作用域。在该范围内&#xff0c;可以访问不带名称的对象&#xff0c;此类函数称为作用域函数。包括: apply函数let函数run…