在工作和生活中,遇到新的同事或合作伙伴时,交换名片是一种普遍的用户需求。纸质名片经常被遗忘、容易丢失,是客户的痛点。因此,市场上出现了很多交换电子名片的APP和小程序。那么,如何为自己的APP开发名片交换功能呢?我们可以接入华为的短距离通信服务,通过设备间的NearbyMessage订阅,快速实现一对一或一对多的换卡。下图是一个功能演示:开发的具体步骤如下:1.开发准备如果您已经是华为开发者,可以省略这一步。如果之前没有集成华为移动服务的经验,需要先配置AppGalleryConnect,开通NFC服务,集成HMSSDK。相关步骤请参考官方文档。2、添加权限使用附近消息前,需要添加网络权限、蓝牙权限、位置权限。在项目的AndroidManifest.xml文件中添加如下权限:-permissionandroid:name="android.permission.BLUETOOTH_ADMIN"/>3.代码开发3.1动态权限申请检查蓝牙开关,定位开关是否打开,网络是否可用,为定位权限申请动态权限@OverridepublicvoidonStart(){super.onStart();getActivity().getApplication().registerActivityLifecycleCallbacks(this);检查权限();}@OverridepublicvoidonRequestPermissionsResult(intrequestCode,String[]permissions,int[]grantResults){for(inti=0;i0){PermissionUtil.requestPermissions(this.getActivity(),deniedPermission,10);}}3.2封装名片发布接口和名片订阅接口,订阅名片消息(onFound),将名片添加到搜索名片对话框中显示;当名片消息丢失(onLost)时,从搜索名片对话框中删除名片privateMessageHandlermMessageHandler=newMessageHandler(){@OverridepublicvoidonFound(Messagemessage){CardInfocardInfo=JsonUtils.json2Object(newString(message.getContent(),Charset.forName("UTF-8")),CardInfo.class);如果(cardInfo==null){返回;}mSearchCardDialogFragment.addCardInfo(cardInfo);}@OverridepublicvoidonLost(Messagemessage){CardInfocardInfo=JsonUtils.json2Object(newString(message.getContent(),Charset.forName("UTF-8")),CardInfo.class);如果(cardInfo==null){返回;}mSearchCardDialogFragment.removeCardInfo(cardInfo);}};privatevoidpublish(Stringnamespace,Stringtype,intttlSeconds,OnCompleteListenerlistener){Messagemessage=newMessage(JsonUtils.object2Json(mCardInfo).getBytes(Charset.forName("UTF-8")),类型,命名空间);策略policy=newPolicy.Builder().setTtlSeconds(ttlS秒).build();PutOptionoption=newPutOption.Builder().setPolicy(policy).build();Nearby.getMessageEngine(getActivity()).put(消息,选项).addOnCompleteListener(监听器);}privatevoidsubscribe(Stringnamespace,Stringtype,intttlSeconds,OnCompleteListenerlistener,GetCallbackcallback){Policypolicy=newPolicy.Builder().setTtlSeconds(ttlSeconds).build();MessagePickerpicker=newMessagePicker.Builder().includeNamespaceType(命名空间,类型).build();GetOption.Builderbuilder=newGetOption.Builder().setPolicy(policy).setPicker(picker);如果(回调!=null){builder.setCallback(回调);附近.getMessageEngine(getActivity()).get(mMessageHandler,builder.build()).addOnCompleteListener(listener);}3.3名片交换菜单处理名片交换码的面对面交换。个人名片发布成功后,订阅名片消息privatebooleanonExchangeItemSelected(){PinCodeDialogFragmentdialogFragment=newPinCodeDialogFragment(passwrod->{MyCardFragment.this.publish(passwrod,passwrod,Policy.POLICY_TTL_SECONDS_MAX,result->{if(!result.isSuccessful()){Stringstr="交换卡失败,因为发布我的卡失败。异常:"+result.getException().getMessage();Log.e(TAG,str);Toast.makeText(getActivity(),str,Toast.LENGTH_LONG).show();return;}MyCardFragment.this.subscribe(密码,密码,Policy.POLICY_TTL_SECONDS_INFINITE,ret->{if(!ret.isSuccessful()){MyCardFragment.this.unpublish(passwrod,passwrod,task->{Stringstr="换卡失败,因为订阅失败,exception("+ret.getException().getMessage()+")";if(!task.isSuccessful()){str=str+"和取消发布失败,exception("+task.getException().getMessage()+")";}Log.e(TAG,str);Toast.makeText(getActivity(),str,Toast.LENGTH_LONG).show();});返回;}mSearchCardDialogFragment.setOnCloseListener(()->{MyCardFragment.this.unpublish(passwrod,passwrod,task->{if(!task.isSuccessful()){Toast.makeText(getActivity(),"取消发布我的卡片失败,异常:"+task.getException().getMessage(),Toast.LENGTH_LONG).show();}});MyCardFragment.this.unsubscribe(task->{if(!task.isSuccessful()){Toast.makeText(getActivity(),"取消订阅失败,异常:"+task.getException().getMessage(),Toast.LENGTH_LONG).show();}});});mSearchCardDialogFragment.show(getParentFragmentManager(),"搜索卡片");},无效的);});});dialogFragment.show(getParentFragmentManager(),"密码");返回真;从参数列表中删除并将数据保存到本地存储@OverridepublicvoidonFavorite(CardInfocardInfo,booleanisFavorite){if(isFavorite){mFavoriteMap.put(cardInfo.getId(),cardInfo);}else{mFavoriteMap.remove(cardInfo.getId());}Setset=newHashSet<>(mFavoriteMap.size());for(CardInfocard:mFavoriteMap.values()){set.add(JsonUtils.object2Json(card));}SharedPreferencessharedPreferences=getContext().getSharedPreferences("data",Context.MODE_PRIVATE);sharedPreferences.edit().putStringSet(Constants.MY_FAVORITES_KEY,set).apply();本demo使用了华为HMSNearby服务的近距离设备间消息订阅功能。基于NearbyMessage能力,不仅可以用来面对面交换名片,还可以帮助开发者实现很多有趣的功能,比如:竞技类手游中的面对面组队功能,面对面-棋牌手游面对面预约功能近场AA支付功能音乐曲目分享功能更多详情请访问华为NFC官网获取华为NFC开发指导文档华为NFC开源仓库地址:GitHub、GiteeHuaweiHMSCore官方论坛解决集成问题,请到StackOverflow上关注我们,第一时间了解HMSCore的最新技术~