这么递名片才高效!教你给应用开发个交换名片功能

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

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

开发具体步骤如下:

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();}

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

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

欲了解更多详情

访问华为近距离通信服务官网
获取华为近距离通信服务开发指导文档
华为近距离通信服务开源仓库地址:GitHub、Gitee
华为HMS Core官方论坛 
解决集成问题请到Stack Overflow

关注我们,第一时间了解HMS Core最新技术~

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML制作个人名片

题目&#xff1a;.完成以下效果图&#xff0c;上传代码和效果图。&#xff08;具体样式提示如下&#xff1a; 整个大盒子尺寸为:150*278,效果图居中对齐&#xff0c;左右外边距50px,字体&#xff1a;楷体&#xff1b;2.段落设置&#xff1a;尺寸&#xff1a;138*33&#xff0c;…

高斯判别分析(GDA)公式推导

解&#xff1a;将概率分布代入对数似然函数&#xff0c; l ( ψ , μ 0 , μ 1 , ∑ ) ∑ i 1 m l o g p X ∣ Y ( x ( i ) ∣ y ( i ) ; μ 0 , μ 1 , ∑ ) ∑ i 1 m l o g p Y ( y ( i ) ; ψ ) l(\psi,\mu_0,\mu_1,\sum)\sum^m_{i1}{log{p_{X|Y}(x^{(i)}|y^{(i)};\mu_0…

算法笔记(六):差分法

&#xff08;6&#xff09;差分法 目录 一、差分 1、介绍 2、定义 3、差分与前缀和 二、一维差分 1、定义 2、作用 3、方法 接下来是实战演练&#xff01;&#xff01;&#xff01; 三、二维差分 1、定义 2、作用 3、方法 接下来是实战演练&#xff01;&#xf…

差分 --算法竞赛专题解析(32)

本系列文章将于2021年整理出版。前驱教材&#xff1a;《算法竞赛入门到进阶》 清华大学出版社 网购&#xff1a;京东 当当   作者签名书&#xff1a;点我 有建议请加QQ 群&#xff1a;567554289 文章目录 1. 一维差分1.1 一维差分的概念1.2 差分的局限性 2. 二维差分2.1 用差…

MiniGPT4,开源了

点击“开发者技术前线”&#xff0c;选择“星标” 让一部分开发者看到未来 量子位 | 公众号 QbitAI GPT-4识图功能迟迟不开放&#xff0c;终于有人忍不住自己动手做了一个。 MiniGPT-4来了&#xff0c;Demo开放在线可玩。 传一张海鲜大餐照片上去&#xff0c;就能直接获得菜谱。…

不愧是微软出品的工具,逆天!

上一篇&#xff1a;逆向了一款涉黄APP&#xff0c;发现了她们的小秘密... 大家好&#xff0c;今天分享一些微软出品的实用小工具&#xff0c;希望对大家有所帮助。 原文链接&#xff1a;https://www.pconline.com.cn/win11/1501/15013664.html 系统增强工具PowerToys 下载地址&…

人工智能AI如何工作及使用

chatgpt聊天软件是一款非常好玩的智能聊天软件&#xff0c;如果你觉得生活非常无趣&#xff0c;或者没有人能诉说烦恼&#xff0c;那么这款软件一定非常适合你。 小凡AI是一款专业的智能助手&#xff0c;可以帮助您快速、高效地处理各种工作任务。它包含强大的语音识别和自然语…

老胡的周刊(第094期)

老胡的信息周刊[1]&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 &#x1f3af; 项目 qrbtf[2] 艺术二维码生成器&#xff1a; qrb…

两则靠谱的AI招聘信息;长文档阅读的辅助总结神器 Obsidian Copliot;LLM 应用开发全栈指南;重写人工智能时代的创业手册 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 两则靠谱的AI招聘信息&#xff1a;奇绩创坛 & Copilot Hub 6月14日&#xff0c;奇绩创坛在「奇绩大模型日报体验群」发布招聘信息…

比OpenAI更快一步,最新开源的MiniGPT-4模型可让开发者提前感受GPT-4识图能力!...

整理 | 屠敏 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 迄今为止&#xff0c;GPT-4 凭借多模态能力已经成为 AI 领域备受关注的大模型&#xff0c;不过值得注意的是&#xff0c;OpenAI 在推出 GPT-4 时虽然引入了对图像理解的能力&#xff0c;但并没有在除了…

谷歌Bard大升级:支持中文,识图功能上线

出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013) 谷歌对话式 AI 产品 Bard 昨日发布了重要更新&#xff0c;现在已支持更多国家 / 地区和更多语言&#xff08;包括中文&#xff09;。 此外还添加了 Google Lens 功能 —— 可在 prompt 中使用图像&#xff0c;以及新…

ChatGPT类产品和技术的产生会带来哪些影响?

2023年3月15日&#xff0c;GPT-4的发布再次引爆互联网&#xff0c;原有的自然语言理解、推理和对话能力继续增强&#xff0c;更引入了识图等多模态识别功能&#xff0c;有研究认为可以将其视为“通用性人工智能”的初步阶段。在国内&#xff0c;百度同类产品“文心一言“的发布…

基于GPT-4的 IDEA 神仙插件,无需魔法,亲测好用!

近日&#xff0c;Intellij IDEA的插件商店&#xff0c;悄然上线了一个新的插件——Bito&#xff0c;据说可以基于GPT-4和ChatGPT来写代码。短短几天&#xff0c;已经有50多K的下载量了。 我帮大家试用了一下&#xff0c;亲测好用&#xff01; 根据插件介绍显示&#xff0c;Bito…

ChatGPT大浪潮下,AIGC已经开始改造时尚行业了

编辑 | 机器之心 点击下方卡片&#xff0c;关注“自动驾驶之心”公众号 ADAS巨卷干货&#xff0c;即可获取 点击进入→自动驾驶之心【AIGC】技术交流群 AIGC 这股风&#xff0c;吹到了时尚行业&#xff0c;会带来哪些生产力革新&#xff1f; 上线五天&#xff0c;用户破百万&am…

硅谷银行一夜倒闭,海量创业公司遭殃,工资房租统统拿不出

金磊 发自 凹非寺量子位 | 公众号 QbitAI 一夜之间&#xff0c;硅谷银行倒闭了。 这家最受科技和生命科学初创公司青睐的金融机构&#xff0c;就这么被美国联邦存款保险公司&#xff08;FDIC&#xff09;宣判了“死刑”。 事件影响之大&#xff0c;CNBC甚至这样评价&#xff1a…

让我们一起来看看可爱的猫咪吧

我想喜欢小猫咪的人&#xff0c;一定非常可爱和温柔吧 前言 这个视频中的小猫咪贼可爱&#xff0c;然后下面的那给进度条是只小猫咪走来走去的。 然后我就想可以拿进度条做点事情&#xff0c;一开始想搜一搜借鉴一下&#xff0c;但是根本没有这种高度自定义的。唉 经历 互联…

编写猫咪相册应用 HTML

文章目录 1. 标题元素标签2. p元素用于在网站上创建一段文本3. 注释4. 页面主要部分标识标签5. 通过使用img元素来为你的网站添加图片6. 使用锚点元素(a)链接到另一个页面7. 使用 section 元素将照片内容与未来的内容分开8. 无序列表(ul)元素&#xff0c;列表项(li)元素在列表中…

ChatGPT|一文读懂GPT-4!

前言 大家好&#xff0c;今天早上一早醒来&#xff0c;发现各大科技圈公众号平台开始刷屏OpenAI发布的新模型GPT4.0&#xff0c;看这个版本号就已经知道又是一大波特性的更新。 于是立马起来开始学习&#xff01; GPT-4 发布视频&#xff08;2023.03.15&#xff09; www.youtub…

李彦宏谈文心一言:市场反馈符合预期;OpenAI CEO 承认害怕 ChatGPT;Twitter 将开源推荐算法源码|极客头条

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&…