程式員為女友而備的禮物清單里,除了玫瑰、包包、和口紅,就沒有其他有新意又有心意的驚喜了嘛?
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,并通過布局檔案設定地圖的屬性,
<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;
開發效果
編譯安裝完成后,開啟應用,便會根據實時的位置資訊,在地圖上繪制出運動軌跡

>>訪問華為開發者聯盟官網,了解更多相關內容
>>獲取開發指導檔案
>>華為移動服務開源倉庫地址:GitHub、Gitee
關注我們,第一時間了解華為移動服務最新技術資訊~
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/267156.html
標籤:其他
