如何用HMS Nearby Service给自己的APP开发一个名片交换功能?

2023-10-30 01:10

本文主要是介绍如何用HMS Nearby Service给自己的APP开发一个名片交换功能?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  在工作和生活中,遇见新的同事或者合作伙伴,交换名片是一个常见的用户需求,纸质名片常忘带、易丢失,是客户的一个痛点。因此,市场上出现了很多交换电子名片的APP和小程序。那么,如何给自己的APP开发一个名片交换功能呢?

在这里插入图片描述

  我们可以接入华为近距离通信服务,通过近距离设备间消息订阅(Nearby Message),快速实现一对一或一对多名片交换。下图是功能演示:

在这里插入图片描述

  如果你对实现方式感兴趣,可以去Github去下载源代码,大家可以基于具体的应用场景优化。

  Github demo下载地址:https://github.com/HMS-Core/hms-nearby-demo/tree/master/NearbyCardExchange

开发具体步骤如下:

1. 开发准备

  如果您已经是华为的开发者,可以省略此步骤。如果您以前没有集成华为移动服务的经验,那么需要先配置AppGallery Connect,开通近距离通信服务并集成HMS SDK。相关步骤请参考官方文档。

2. 添加权限

  在使用Nearby Message之前,需要添加网络权限、蓝牙权限、位置权限。在工程的AndroidManifest.xml文件中添加如下权限:

<uses-permission android:name="android.permission.INTERNET " /><uses-permission android:name="android.permission.BLUETOOTH" /><uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /><!-- The location permission is also required in Android 6.0 or later. --><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

3. 代码开发

3.1 动态权限申请

  检查蓝牙开关、位置开关是否打开、网络是否可用,并对位置权限进行动态权限申请

@Overridepublic void onStart() {super.onStart();getActivity().getApplication().registerActivityLifecycleCallbacks(this);checkPermission();}@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {for (int i = 0; i < permissions.length; ++i) {if (grantResults[i] != 0) {showWarnDialog(Constants.LOCATION_ERROR);}}}private void checkPermission() {if (!BluetoothCheckUtil.isBlueEnabled()) {showWarnDialog(Constants.BLUETOOTH_ERROR);return;}if (!LocationCheckUtil.isLocationEnabled(this.getActivity())) {showWarnDialog(Constants.LOCATION_SWITCH_ERROR);return;}if (!NetCheckUtil.isNetworkAvailable(this.getActivity())) {showWarnDialog(Constants.NETWORK_ERROR);return;}String[] deniedPermission = PermissionUtil.getDeniedPermissions(this.getActivity(), new String[] {Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION});if (deniedPermission.length > 0) {PermissionUtil.requestPermissions(this.getActivity(), deniedPermission, 10);}}

3.2 封装名片发布接口和名片订阅接口

  订阅到的名片消息(onFound),把名片添加到查找名片对话框中显示;名片消息丢失时(onLost),从查找名片对话框中删除该名片

private MessageHandler mMessageHandler = new MessageHandler() {@Overridepublic void onFound(Message message) {CardInfo cardInfo = JsonUtils.json2Object(new String(message.getContent(), Charset.forName("UTF-8")),CardInfo.class);if (cardInfo == null) {return;}mSearchCardDialogFragment.addCardInfo(cardInfo);}@Overridepublic void onLost(Message message) {CardInfo cardInfo = JsonUtils.json2Object(new String(message.getContent(), Charset.forName("UTF-8")),CardInfo.class);if (cardInfo == null) {return;}mSearchCardDialogFragment.removeCardInfo(cardInfo);}};private void publish(String namespace, String type, int ttlSeconds, OnCompleteListener<Void> listener) {Message message = new Message(JsonUtils.object2Json(mCardInfo).getBytes(Charset.forName("UTF-8")), type,namespace);Policy policy = new Policy.Builder().setTtlSeconds(ttlSeconds).build();PutOption option = new PutOption.Builder().setPolicy(policy).build();Nearby.getMessageEngine(getActivity()).put(message, option).addOnCompleteListener(listener);}private void subscribe(String namespace, String type, int ttlSeconds, OnCompleteListener<Void> listener,GetCallback callback) {Policy policy = new Policy.Builder().setTtlSeconds(ttlSeconds).build();MessagePicker picker = new MessagePicker.Builder().includeNamespaceType(namespace, type).build();GetOption.Builder builder = new GetOption.Builder().setPolicy(policy).setPicker(picker);if (callback != null) {builder.setCallback(callback);}Nearby.getMessageEngine(getActivity()).get(mMessageHandler, builder.build()).addOnCompleteListener(listener);}

3.3 名片交换菜单处理

  面对面交换名片交换码,发布个人名片成功后,订阅名片消息

private boolean onExchangeItemSelected() {PinCodeDialogFragment dialogFragment = new PinCodeDialogFragment(passwrod -> {MyCardFragment.this.publish(passwrod, passwrod, Policy.POLICY_TTL_SECONDS_MAX, result -> {if (!result.isSuccessful()) {String str = "Exchange card fail, because publish my card fail. exception: "+ result.getException().getMessage();Log.e(TAG, str);Toast.makeText(getActivity(), str, Toast.LENGTH_LONG).show();return;}MyCardFragment.this.subscribe(passwrod, passwrod, Policy.POLICY_TTL_SECONDS_INFINITE, ret -> {if (!ret.isSuccessful()) {MyCardFragment.this.unpublish(passwrod, passwrod, task -> {String str = "Exchange card fail, because subscribe is fail, exception("+ ret.getException().getMessage() + ")";if (!task.isSuccessful()) {str = str + " and unpublish fail, exception(" + task.getException().getMessage()+ ")";}Log.e(TAG, str);Toast.makeText(getActivity(), str, Toast.LENGTH_LONG).show();});return;}mSearchCardDialogFragment.setOnCloseListener(() -> {MyCardFragment.this.unpublish(passwrod, passwrod, task -> {if (!task.isSuccessful()) {Toast.makeText(getActivity(), "Unpublish my card fail, exception: "+ task.getException().getMessage(), Toast.LENGTH_LONG).show();}});MyCardFragment.this.unsubscribe(task -> {if (!task.isSuccessful()) {Toast.makeText(getActivity(), "Unsubscribe fail, exception: "+ task.getException().getMessage(), Toast.LENGTH_LONG).show();}});});mSearchCardDialogFragment.show(getParentFragmentManager(), "Search Card");}, null);});});dialogFragment.show(getParentFragmentManager(), "pin code");return true;}

3.4 收藏名片处理

  收藏名片时把名片加入收藏列表,名片取消收藏时把名片从参数列表中删除,并把数据保存到本地存储中。

@Overridepublic void onFavorite(CardInfo cardInfo, boolean isFavorite) {if (isFavorite) {mFavoriteMap.put(cardInfo.getId(), cardInfo);} else {mFavoriteMap.remove(cardInfo.getId());}Set<String> set = new HashSet<>(mFavoriteMap.size());for (CardInfo card : mFavoriteMap.values()) {set.add(JsonUtils.object2Json(card));}SharedPreferences sharedPreferences = getContext().getSharedPreferences("data", Context.MODE_PRIVATE);sharedPreferences.edit().putStringSet(Constants.MY_FAVORITES_KEY, set).apply();}

4.结后语

  本次给大家演示的demo用到了华为HMS Nearby service的近距离设备间消息订阅功能。基于Nearby Message能力不仅仅可以用来做面对面交换名片,还可以帮助开发者实现很多有趣的功能,例如:

  1. 竞技类手游中的面对面组队功能
  2. 棋牌类手游中的面对面约局功能
  3. 近场AA收款功能
  4. 音乐曲目共享功能

更详细的开发指南参考华为开发者联盟官网:https://developer.huawei.com/consumer/cn/doc/development/HMS-Guides/nearby-service-introduction


往期链接:教你如何开发一个完败Miracast的投屏新功能
原文链接:https://developer.huawei.com/consumer/cn/forum/topicview?tid=0201276303118820181&fid=18
原作者:赵照

这篇关于如何用HMS Nearby Service给自己的APP开发一个名片交换功能?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/304622

相关文章

PyQt5 GUI 开发的基础知识

《PyQt5GUI开发的基础知识》Qt是一个跨平台的C++图形用户界面开发框架,支持GUI和非GUI程序开发,本文介绍了使用PyQt5进行界面开发的基础知识,包括创建简单窗口、常用控件、窗口属性设... 目录简介第一个PyQt程序最常用的三个功能模块控件QPushButton(按钮)控件QLable(纯文本

Java实现预览与打印功能详解

《Java实现预览与打印功能详解》在Java中,打印功能主要依赖java.awt.print包,该包提供了与打印相关的一些关键类,比如PrinterJob和PageFormat,它们构成... 目录Java 打印系统概述打印预览与设置使用 PageFormat 和 PrinterJob 类设置页面格式与纸张

MySQL 8 中的一个强大功能 JSON_TABLE示例详解

《MySQL8中的一个强大功能JSON_TABLE示例详解》JSON_TABLE是MySQL8中引入的一个强大功能,它允许用户将JSON数据转换为关系表格式,从而可以更方便地在SQL查询中处理J... 目录基本语法示例示例查询解释应用场景不适用场景1. ‌jsON 数据结构过于复杂或动态变化‌2. ‌性能要

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

Golang如何用gorm实现分页的功能

《Golang如何用gorm实现分页的功能》:本文主要介绍Golang如何用gorm实现分页的功能方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景go库下载初始化数据【1】建表【2】插入数据【3】查看数据4、代码示例【1】gorm结构体定义【2】分页结构体

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

Java Web实现类似Excel表格锁定功能实战教程

《JavaWeb实现类似Excel表格锁定功能实战教程》本文将详细介绍通过创建特定div元素并利用CSS布局和JavaScript事件监听来实现类似Excel的锁定行和列效果的方法,感兴趣的朋友跟随... 目录1. 模拟Excel表格锁定功能2. 创建3个div元素实现表格锁定2.1 div元素布局设计2.

Python中对FFmpeg封装开发库FFmpy详解

《Python中对FFmpeg封装开发库FFmpy详解》:本文主要介绍Python中对FFmpeg封装开发库FFmpy,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、FFmpy简介与安装1.1 FFmpy概述1.2 安装方法二、FFmpy核心类与方法2.1 FF