定位项目示例:
项目介绍:
该项目结合了百度地图的定位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-data
android: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 {
@Override
public void onReceiveLocation(BDLocation location)
{
LongitudeId=location.getLongitude();//经度获取
LatitudeId=location.getLatitude();//纬度获取
System.out.println("经度0:"+LongitudeId);
System.out.println("纬度0:"+LatitudeId);
requestCityInfo(LongitudeId,LatitudeId);//获取定位城市的ID
}
}
// 用经纬度向服务器请求获取城市json
public 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() {
@Override
public 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);
}
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(WeatherActivity.this,"经纬度请求城市信息失败",Toast.LENGTH_SHORT).show();
}
});
}
});
}
最后记得关闭定位,不然会在后台一直定位,会耗电:
//软件生命周期结束之后关闭定位
@Override
protected void onDestroy()
{
super.onDestroy();
mLocationClient.stop();
}
其中的CityID就是我们所需的城市代号,利用它就可以直接向和风天气申请定位地的城市信息了。
这里只是简单的函数介绍,具体代码可以去Github参考我的demo,有全部源码。
(喜欢的话Github去Follow一下我也是不错的,哈哈哈)
源码地址:https://github.com/LalmonDev/LBStest
Create By Lalmon
4/28/2019
转载请注明出处,谢谢!