百度地图定位API+和风天气城市搜索API构成的天气定位模块
定位項目示例:
項目介紹:
? ? 該項目結合了百度地圖的定位API和和風天氣的城市搜索API,目的在于為天氣預報提供一個定位接口。利用該接口可以直接向和風天氣的天氣API直接申請定位地的天氣情況。
? ? 思路:利用百度地圖API的網絡定位+GPS定位功能產生兩個參數:經度,緯度。然后把經緯度傳遞給和風天氣的城市搜索API,API會根據經緯度返回該位置的一個城市代號(cityid),該id可以直接向和風天氣的天氣API申請獲取天氣信息。
? ? 其實這個可以作為《第一行代碼》課本后面的酷歐天氣項目的定位功能拓展,它們都是使用了和風天氣的API。
項目流程:
一、首先我們需要了解這3個API:
? ? ? ? 1.百度地圖定位API:http://lbsyun.baidu.com/index.php?title=android-locsdk
? ? ? ? 2.和風天氣城市搜索API:https://dev.heweather.com/docs/search/find
? ? ? ? 3.和風天氣天氣數據API:https://dev.heweather.com/docs/api/weather
注冊百度開發者,申請一個API Key,并且下載所需的SDK(地址:http://lbsyun.baidu.com/index.php?title=android-locsdk/geosdk-android-download),配置好項目。《第一行代碼第2版》P379~386 有詳細介紹,實在不懂的可以給我留言。
二、代碼實現部分:
先修改AndroidManifest.xml,申請必要的權限
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/><uses-permission android:name="android.permission.READ_PHONE_STATE"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><uses-permission android:name="android.permission.WAKE_LOCK"/><service android:name="com.baidu.location.f" android:enabled="true"android:process=":remote"></service><meta-dataandroid:name="com.baidu.lbsapi.API_KEY"android:value="這里是放百度API Key的"/>然后利用百度地圖的定位API獲取經緯度:
// 定位函數private void requestLocation(){initLocation();//定位初始化mLocationClient.start();//開始定位} // 定位初始化private void initLocation(){LocationClientOption option=new LocationClientOption();option.setScanSpan(5000);//每隔5s刷新一下option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors);//開啟GPS定位mLocationClient.setLocOption(option);} // 定位結果信息賦值public class MyLocationListener implements BDLocationListener {@Overridepublic void onReceiveLocation(BDLocation location){LongitudeId=location.getLongitude();//經度獲取LatitudeId=location.getLatitude();//緯度獲取System.out.println("經度0:"+LongitudeId);System.out.println("緯度0:"+LatitudeId);requestCityInfo(LongitudeId,LatitudeId);//獲取定位城市的ID}} // 用經緯度向服務器請求獲取城市jsonpublic void requestCityInfo(double longitude,double latitude){String cityUrl="https://search.heweather.net/find?location="+longitude+","+latitude+"&key=8e669fb35db1436496ad76e9aec7ba60";System.out.println("請求鏈接:"+cityUrl);HttpUtil.sendOkHttpRequest(cityUrl, new Callback() {@Overridepublic void onResponse(Call call, Response response) throws IOException {final String responseCityInfoText=response.body().string();System.out.println("返回的信息:"+responseCityInfoText); // 把返回的數據交到Utility進行Gson解析cityId CITYID=new cityId();CITYID=Utility.handleCityIdResponse(responseCityInfoText);for (cityInfo_basic basic:CITYID.basicsList){CityID=basic.cityID;LocationName=basic.LocationName;Parent_cityName=basic.Parent_cityName;Admin_areaName=basic.Admin_areaName;}locationName=Admin_areaName+"-"+Parent_cityName+"-"+LocationName;System.out.println("最后的定位:"+locationName);System.out.println("最后的一步,ID:"+CityID);}@Overridepublic void onFailure(Call call, IOException e) {e.printStackTrace();runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(WeatherActivity.this,"經緯度請求城市信息失敗",Toast.LENGTH_SHORT).show();}});}});}最后記得關閉定位,不然會在后臺一直定位,會耗電:?
//軟件生命周期結束之后關閉定位@Overrideprotected void onDestroy(){super.onDestroy();mLocationClient.stop();}?
其中的CityID就是我們所需的城市代號,利用它就可以直接向和風天氣申請定位地的城市信息了。
這里只是簡單的函數介紹,具體代碼可以去Github參考我的demo,有全部源碼。
(喜歡的話Github去Follow一下我也是不錯的,哈哈哈)
源碼地址:https://github.com/LalmonDev/LBStest
?
Create By Lalmon
4/28/2019
轉載請注明出處,謝謝!
總結
以上是生活随笔為你收集整理的百度地图定位API+和风天气城市搜索API构成的天气定位模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何处理下面的问题
- 下一篇: WPF Binding绑定模式