程序员为女友而备的礼物清单里,除了玫瑰、包包、和口红,就没有其他有新意又有心意的惊喜了嘛?

No!这个“×”是远在法国出差的阿强比的,作为菊厂一向低调行事的程序员,阿强决定在今年的3月8日女神节,给女友来点特别的小浪漫。

刚刚过去的情人节,朋友圈扎堆的秀恩爱千篇一律,Selina捧着半人高的玫瑰,Jessica秀出了新买的包包,Rebecca则是和男友在烛光摇曳中共进晚餐……而阿强更想来一招出其不意,在女神节给心中独一无二的Aveline来一次不一样的表白。

望着窗外的埃菲尔铁塔,阿强心生一计,拿出程序员吃饭的本领,写了一个运动轨迹绘制App,在法(fà)国,成功唤醒了自己的浪漫基因,用身体力行告诉女友:我所走的每一步,都是爱你的样子。

三八女神节来临之际,我们奉上这款表白教程详解,给你支一招,不妨也为你的女神也来一次特别的节日祝福~

实现原理

首先借助华为定位服务(Location Kit),其采用GNSS、Wi-Fi、基站等多途径的混合定位模式进行定位,能快速、精准获取位置信息,实现全球定位服务能力;再使用华为地图服务(Map Kit),Map Kit提供一套地图开发调用的SDK,地图数据覆盖超过200个国家和地区,支持一百多种语言,利用丰富的地图个性化呈现工具,将获取的定位信息绘制到地图上,实现运动轨迹的实时绘制。

用轨迹表白是属于程序员的浪漫,除此之外,地图定位轨迹绘制功能还有丰富的应用场景,比如在运动健康应用中,提供记录运动轨迹、回放运动路线、计算运动距离等LBS能力支撑,精准量化健康的每一步。

开发准备

1、在华为开发者联盟网站创建应用并配置签名证书
2、配置华为 Maven仓地址,在应用级的“build.gradle”文件中添加编译SDK依赖

dependencies {
implementation 'com.huawei.hms:location: 5.1.0.301'
implementation 'com.huawei.hms:maps: 5.1.0.300'
}

3、配置混淆脚本
上述步骤具体可参考开发者网站中的开发准备介绍:
https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/config-agc-0000001057629153?ha_source=hms1
4、在AndroidManifest.xml文件里面声明系统权限
因华为定位服务采用GNSS、Wi-Fi、基站等多种混合定位模式进行定位,赋予您的应用程序快速、精准地获取用户位置信息的能力,需要用到网络,精确的位置权限,粗略的位置权限如果您需要应用程序在后台执行时也具备持续定位能力,需要在Manifest文件中申请ACCESS_BACKGROUND_LOCATION权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="com.huawei.hms.permission.ACTIVITY_RECOGNITION" />
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />

开发步骤

1.地图呈现

目前华为地图SDK支持的地图容器有两种,SupportMapFragment、MapView。本文采用的是SupportMapFragment的方式。
1)  在Activity的布局文件(例如:activity_main.xml)中添加一个Fragment,并通过布局文件设置地图的属性。

<fragmentandroid:id="@+id/mapfragment_routeplanningdemo"android:name="com.huawei.hms.maps.SupportMapFragment"android:layout_width="match_parent"android:layout_height="match_parent" />

2) 要在应用程序中使用地图,您需要实现OnMapReadyCallback接口。

RoutePlanningActivity extends AppCompatActivity implements OnMapReadyCallback

3) 在Activity的onCreate()方法中加载SupportMapFragment,并调用getMapAsync()来注册回调。

Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.mapfragment_routeplanningdemo);
if (fragment instanceof SupportMapFragment) {SupportMapFragment mSupportMapFragment = (SupportMapFragment) fragment;mSupportMapFragment.getMapAsync(this);
}

4)  在onMapReady回调中获取HuaweiMap对象。

@Override
public void onMapReady(HuaweiMap huaweiMap) {hMap = huaweiMap;hMap.setMyLocationEnabled(true);hMap.getUiSettings().setMyLocationButtonEnabled(true);
}

2.Location功能实现

1)  Location权限检查

XXPermissions.with(this)// 申请多个权限.permission(Permission.Group.LOCATION).request(new OnPermission() {@Overridepublic void hasPermission(List<String> granted, boolean all) {if (all) {getMyLoction();} else{Toast.makeText(getApplicationContext(),"拒绝权限之后可能会导致功能不能使用",Toast.LENGTH_SHORT).show();}}@Overridepublic void noPermission(List<String> denied, boolean never) {if (never) {XXPermissions.startPermissionActivity(RoutePlanningActivity.this, denied);} else {XXPermissions.startPermissionActivity(RoutePlanningActivity.this, denied);}}});

2) 当前位置定位并展示在地图上。需要先检查定位开关是否开启,如果没开启就不能拿到定位数据。

SettingsClient settingsClient = LocationServices.getSettingsClient(this);
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(1000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
builder.addLocationRequest(mLocationRequest);
LocationSettingsRequest locationSettingsRequest = builder.build();
//检查设备定位设置
settingsClient.checkLocationSettings(locationSettingsRequest).addOnSuccessListener(locationSettingsResponse -> {//设置满足定位条件,再发起位置请求fusedLocationProviderClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.getMainLooper()).addOnSuccessListener(aVoid -> {//接口调用成功的处理Log.d(TAG, "onSuccess: " + aVoid);});}).addOnFailureListener(e -> {//设置不满足定位条件int statusCode = ((ApiException) e).getStatusCode();if (statusCode == LocationSettingsStatusCodes.RESOLUTION_REQUIRED) {try {ResolvableApiException rae = (ResolvableApiException) e;//调用startResolutionForResult可以弹窗提示用户打开相应权限rae.startResolutionForResult(RoutePlanningActivity.this, 0);} catch (IntentSender.SendIntentException sie) {sie.printStackTrace();}}});

3.根据实时位置在地图上绘制线路的线条

private void addPath(LatLng latLng1, LatLng latLng2) {PolylineOptions options = new PolylineOptions().color(Color.BLUE).width(5);List<LatLng> path = new ArrayList<>();path.add(latLng1);path.add(latLng2);for (LatLng latLng : path) {options.add(latLng);}Polyline polyline = hMap.addPolyline(options);mPolylines.add(polyline);
}
在MAP KIT的基础上结合路径规划的能力将定位的结果实时的上传到云测,然后返回路线并展示在地图上。
String mWalkingRoutePlanningURL = "https://mapapi.cloud.huawei.com/mapApi/v1/routeService/walking";
String url = mWalkingRoutePlanningURL + "?key=" + key;Response response = null;
JSONObject origin = new JSONObject();
JSONObject destination = new JSONObject();
JSONObject json = new JSONObject();
try {origin.put("lat", latLng1.latitude);origin.put("lng", latLng1.longitude);destination.put("lat", latLng2.latitude);destination.put("lng", latLng2.longitude);json.put("origin", origin);json.put("destination", destination);RequestBody requestBody = RequestBody.create(JSON, String.valueOf(json));Request request = new Request.Builder().url(url).post(requestBody).build();response = getNetClient().initOkHttpClient().newCall(request).execute();
} catch (JSONException e) {e.printStackTrace();
} catch (IOException e) {e.printStackTrace();
}
return response;

开发效果

编译安装完成后,开启应用,便会根据实时的位置信息,在地图上绘制出运动轨迹

>>访问华为开发者联盟官网,了解更多相关内容

>>获取开发指导文档

>>华为移动服务开源仓库地址:GitHub、Gitee

关注我们,第一时间了解华为移动服务最新技术资讯~

三·八节,菊厂程序员用“运动轨迹绘制”向女神表白相关推荐

  1. 菊厂程序员每天轻松跟练刘畊宏健身操,到底怎么做到的?

    健身房不开,国民"运动量"却爆发式上涨. 私教都拉不回的运动自律,被刘畊宏的一套毽子操拉回来了.最近程序员阿强也在女友的打卡带动下,跟着刘教练开启了在家健身模式,线上与千万网友隔空 ...

  2. 凌晨三点,各类程序员都在干吗?

    1.凌晨三点,各类程序员都在干吗? 我想问,前端是不是提早下班了? 2.三天后再回头看看自己写的代码 3.代码质量 VS 开发时间 4.程序员的爱情观 5.一定要看到最后 记得点击「在看」,然后转给你 ...

  3. 鹅厂程序员最喜欢用什么编程语言?Leader写代码么?

    刚刚,<腾讯研发大数据报告>正式发布. 里面有一些可能你比较感兴趣的内容,比如: 鹅厂有多少程序员? 鹅厂一年输出多少代码? 鹅厂程序员最喜欢用什么编程语言? 鹅厂技术 Leader 写代 ...

  4. 鹅厂程序员在家撸码的十大姿势

    大家好,我是帅气的他二哥,好久不见-在家办公已经一周多了,不知各位感觉如何?曾经的你以为在家办公爽歪歪,今天的你迫不及待想回公司上班电脑屏幕太小,椅子不舒服,网络不好,没有下班时间,被娃骑脸输出,被做 ...

  5. 年增代码 12.9 亿行,每天完成需求近 4000 个,鹅厂程序员秘密大爆料!

    整理 | 伍杏玲 出品 | 程序人生(ID:coder_life) 封图 | 程序人生付费下载于视觉中国 2019年,腾讯员工两次以"壕无人性"喜提热搜:网友根据腾讯第一季财报算出 ...

  6. 「递归」第2集 | 变得了魔术,解得了高数,这届鹅厂程序员有点酷

    我们为什么叫「递归」 "递归" (recursion) 是一种在程序设计语言中被广泛使用的算法.它有两大特点,一是调用自己,二是化繁为简.我们当中那些优秀的技术人又何尝不是如此?他 ...

  7. java内存shell_2019蚂蚁金服Java后端三面,详述程序员必须掌握的架构底层原理

    前面的话 告别了2018 ,也早已正式进入2019 面试一直都是大家关注的热门话题,俗话说"金三银四",如今已经是三月份了,如果你打算在年后跳槽,那么是时候该着手准备了 很多Jav ...

  8. 程序员绩效总结_阿里五年晋升三次,这个程序员要聊聊他的选择

    小二穆远是蚂蚁金服的一名程序员,五年晋升了三次,他要聊聊自己的五年阿里之旅,那些变化.坚持和泪水. 说起与阿里的缘分,是因为读书时在T公司实习,不喜欢实习那个组的工作内容,毅然决定来阿里工作.其实现在 ...

  9. 阿里五年晋升三次,这个程序员要聊聊他的选择

    小二穆远是蚂蚁金服的一名程序员,五年晋升了三次,他要聊聊自己的五年阿里之旅,那些变化.坚持和泪水.请看本期的年陈故事会. 说起与阿里的缘分,是因为读书时在T公司实习,不喜欢实习那个组的工作内容,毅然决 ...

最新文章

  1. Linux下用汇编输出Hello, world
  2. 自学是一门艺术:踏上数据科学、人工智能和机器学习的自学之路
  3. mac os vmware 显卡驱动_【新机】华为Mate 40系列国行售价明天公布,饿了么可以买手机?| 干翻牙膏厂,AMD发布RX6000显卡...
  4. java项目中的classpath
  5. 模糊搜索怎么实现_干货 | 你真的了解自己是怎么搜索的吗_01
  6. html节点上下移动,关于前端:数组元素上下移动
  7. 灵动标签调用友情链接
  8. java 检查进程是否存在
  9. 【设计模式】第四章 工厂模式
  10. 教育|俄罗斯天才少女200万年薪加入华为,22岁拿下世界编程冠军,同天队友也宣布加盟...
  11. 计算机国二笔试试题,全国计算机等考试二笔试试题(2).ppt
  12. vb雅西高速计算机考试,雅西高速沿途风貌车拍八
  13. 【C练习】两个已经从小到大的数组合并成为一个从小到大排序的数组
  14. Android如何在免Root下自动Pay(非人为非无障碍),引起的深思?
  15. 微信小程序商品跳转到第三方
  16. android studio在夜神上打开_android studio 使用夜神模拟器 开发调试
  17. ie9 html5 web worker,HTML5之殇
  18. Android的在线热更新方案_Robust
  19. android移除fragment,Fragment 的创建、替换与移除
  20. vite:配置ip访问

热门文章

  1. UserInterface基本使用总结篇(一)
  2. 多次使用axis2调用webservice后,报连接超时错误
  3. MacOS Catalina黑苹果安装教程
  4. 用java编写人机围棋游戏_JAVA写的围棋游戏的源代码.doc
  5. 交叉功率谱 matlab,wavelet 小波分析基本程序及交叉 计算, 功率谱、 相干谱 matlab 252万源代码下载- www.pudn.com...
  6. 玩cf出现outofmemory_穿越火线出现out,穿越火线outofmemory
  7. 金山毒霸极速版用着不错
  8. bomb二进制炸弹拆除实验(MIPS)
  9. 一次性弄清 高通骁龙芯片最新产品线简介
  10. 小米手机(HM1SW)高通开发android程序全过程