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

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

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

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

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

124

 

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

实现原理

首先借助华为定位服务(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,并通过布局文件设置地图的属性。

<fragment
    android: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() {
            @Override
            public void hasPermission(List<String> granted, boolean all) {
                if (all) {
                    getMyLoction();
                } else{
                    Toast.makeText(getApplicationContext(),"拒绝权限之后可能会导致功能不能使用",Toast.LENGTH_SHORT).show();
                }
            }
            @Override
            public 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;

开发效果

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

13325346

 

 

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

>>获取开发指导文档

>>华为移动服务开源仓库地址:GitHubGitee

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

猜你喜欢

转载自blog.csdn.net/HUAWEI_HMSCore/article/details/114407058