效果图:
添加百度定位功能:
1. 申请密钥,获取数字签名和包名
数字签名:
a.Generate Signed apk---->生成一个jks文件
b.在terminal里面输入: keytool -list -v -keystore D:\AndroidEmulator\zhanghao.jks
c.输入秘钥库口令 z361224g
包名:
到AndroidManifest.xml中找
2.导入SDK
1. 在libs导入BaiduLBS_Android.jar, 在Project Structure中add
2. 在src/main 中新建jniLibs文件夹,将armeabi---liblocSDK6a.so放入jniLibs文件夹
3.配置AndroidManifest.xml
a.在application里面声明Service组件
b.声明使用权限
c.设置AccesssKey
4.实现定位功能:
a.初始化LocationClient类
b.配置定位SDK参数
c.实现BDLocationListener接口
d.开始定位:mLocationClient.start()
e.在定位结束时调用 :mLocationClient.stop()
代码:
1.添加权限
<!-- 这个权限用于进行网络定位-->
<uses-permission android :name= "android.permission.ACCESS_COARSE_LOCATION" ></uses-permission>
<!-- 这个权限用于访问GPS定位-->
<uses-permission android :name= "android.permission.ACCESS_FINE_LOCATION" ></uses-permission>
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android :name= "android.permission.ACCESS_WIFI_STATE" ></uses-permission>
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android :name= "android.permission.ACCESS_NETWORK_STATE" ></uses-permission>
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android :name= "android.permission.CHANGE_WIFI_STATE" ></uses-permission>
<!-- 用于读取手机当前的状态-->
<uses-permission android :name= "android.permission.READ_PHONE_STATE" ></uses-permission>
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
<uses-permission android :name= "android.permission.WRITE_EXTERNAL_STORAGE" ></uses-permission>
<!-- 访问网络,网络定位需要上网-->
<uses-permission android :name= "android.permission.INTERNET" />
<!-- SD卡读取权限,用户写入离线定位数据-->
<uses-permission android :name= "android.permission.MOUNT_UNMOUNT_FILESYSTEMS" ></uses-permission>
<application
android :allowBackup= "true"
android :icon= "@mipmap/icon"
android :label= "@string/app_name"
android :supportsRtl= "true"
android :theme= "@style/AppTheme" >
<activity android :name= ".UI.MainActivity" >
<intent-filter>
<action android :name= "android.intent.action.MAIN" />
<category android :name= "android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!--百度地图定位Service-->
<service android :name= "com.baidu.location.f" android :enabled= "true" android :process= ":remote" >
</service>
<!--百度地图定位Access-Key-->
<meta-data
android :name= "com.baidu.lbsapi.API_KEY"
android :value= "FF:DB:0B:4B:87:97:A7:B4:02:6D:57:CF:D9:D5:54:E3:E9:D2:02:EC;com.zhanghao.pocketweather" />
</application>
<uses-permission android :name= "android.permission.ACCESS_COARSE_LOCATION" ></uses-permission>
<!-- 这个权限用于访问GPS定位-->
<uses-permission android :name= "android.permission.ACCESS_FINE_LOCATION" ></uses-permission>
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android :name= "android.permission.ACCESS_WIFI_STATE" ></uses-permission>
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android :name= "android.permission.ACCESS_NETWORK_STATE" ></uses-permission>
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android :name= "android.permission.CHANGE_WIFI_STATE" ></uses-permission>
<!-- 用于读取手机当前的状态-->
<uses-permission android :name= "android.permission.READ_PHONE_STATE" ></uses-permission>
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
<uses-permission android :name= "android.permission.WRITE_EXTERNAL_STORAGE" ></uses-permission>
<!-- 访问网络,网络定位需要上网-->
<uses-permission android :name= "android.permission.INTERNET" />
<!-- SD卡读取权限,用户写入离线定位数据-->
<uses-permission android :name= "android.permission.MOUNT_UNMOUNT_FILESYSTEMS" ></uses-permission>
<application
android :allowBackup= "true"
android :icon= "@mipmap/icon"
android :label= "@string/app_name"
android :supportsRtl= "true"
android :theme= "@style/AppTheme" >
<activity android :name= ".UI.MainActivity" >
<intent-filter>
<action android :name= "android.intent.action.MAIN" />
<category android :name= "android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!--百度地图定位Service-->
<service android :name= "com.baidu.location.f" android :enabled= "true" android :process= ":remote" >
</service>
<!--百度地图定位Access-Key-->
<meta-data
android :name= "com.baidu.lbsapi.API_KEY"
android :value= "FF:DB:0B:4B:87:97:A7:B4:02:6D:57:CF:D9:D5:54:E3:E9:D2:02:EC;com.zhanghao.pocketweather" />
</application>
2.实现代码
**
* 主页面,Weather
* Created by Administrator on 2016/5/5.
*/
public class WeatherFragment extends Fragment {
private View weatherView ;
//百度地图定位
public LocationClient mLocationClient = null;
public BDLocationListener myListener = new MyLocationListener() ;
//获取数据的url
private static final String urL = "http://apis.haoservice.com/weather/geo?lon=" ;
private String currentUrl ;
@Nullable
@Override
public View onCreateView (LayoutInflater inflater , @Nullable ViewGroup container , @Nullable Bundle savedInstanceState) {
weatherView =inflater.inflate(R.layout. fragment_weather , container ,false ) ;
mLocationClient = new LocationClient(getActivity()) ; //声明LocationClient类
mLocationClient .registerLocationListener( myListener ) ; //注册监听函数
initLocation() ;
mLocationClient .start() ;
return weatherView ;
}
@Override
public void onResume () {
super .onResume() ;
}
/**
* 配置定位SDK参数
*/
private void initLocation (){
LocationClientOption option = new LocationClientOption() ;
option.setLocationMode(LocationClientOption.LocationMode. Hight_Accuracy
) ; //可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
option.setCoorType( "bd09ll" ) ; //可选,默认gcj02,设置返回的定位结果坐标系
int span= 1000 ;
option.setScanSpan(span) ; //可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
option.setIsNeedAddress( true ) ; //可选,设置是否需要地址信息,默认不需要
option.setOpenGps( true ) ; //可选,默认false,设置是否使用gps
option.setLocationNotify( true ) ; //可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
option.setIsNeedLocationDescribe( true ) ; //可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
option.setIsNeedLocationPoiList( true ) ; //可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
option.setIgnoreKillProcess( false ) ; //可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
option.SetIgnoreCacheException( false ) ; //可选,默认false,设置是否收集CRASH信息,默认收集
option.setEnableSimulateGps( false ) ; //可选,默认false,设置是否需要过滤gps仿真结果,默认需要
mLocationClient .setLocOption(option) ;
}
/**
* 百度定位监听接口 BDLocationListener
*/
public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation (BDLocation location) {
//Receive Location
StringBuffer sb = new StringBuffer( 256 ) ;
sb.append( "time : " ) ;
sb.append(location.getTime()) ;
sb.append( " \n error code : " ) ;
sb.append(location.getLocType()) ;
sb.append( " \n latitude : " ) ;
sb.append(location.getLatitude()) ;
sb.append( " \n lontitude : " ) ;
sb.append(location.getLongitude()) ;
sb.append( " \n radius : " ) ;
sb.append(location.getRadius()) ;
if (location.getLocType() == BDLocation. TypeGpsLocation ) { // GPS定位结果
sb.append( " \n speed : " ) ;
sb.append(location.getSpeed()) ; // 单位:公里每小时
sb.append( " \n satellite : " ) ;
sb.append(location.getSatelliteNumber()) ;
sb.append( " \n height : " ) ;
sb.append(location.getAltitude()) ; // 单位:米
sb.append( " \n direction : " ) ;
sb.append(location.getDirection()) ; // 单位度
sb.append( " \n addr : " ) ;
sb.append(location.getAddrStr()) ;
sb.append( " \n describe : " ) ;
sb.append( "gps定位成功" ) ;
} else if (location.getLocType() == BDLocation. TypeNetWorkLocation ) { // 网络定位结果
sb.append( " \n addr : " ) ;
sb.append(location.getAddrStr()) ;
//运营商信息
sb.append( " \n operationers : " ) ;
sb.append(location.getOperators()) ;
sb.append( " \n describe : " ) ;
sb.append( "网络定位成功" ) ;
} else if (location.getLocType() == BDLocation. TypeOffLineLocation ) { // 离线定位结果
sb.append( " \n describe : " ) ;
sb.append( "离线定位成功,离线定位结果也是有效的" ) ;
} else if (location.getLocType() == BDLocation. TypeServerError ) {
sb.append( " \n describe : " ) ;
sb.append( "服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因" ) ;
} else if (location.getLocType() == BDLocation. TypeNetWorkException ) {
sb.append( " \n describe : " ) ;
sb.append( "网络不同导致定位失败,请检查网络是否通畅" ) ;
} else if (location.getLocType() == BDLocation. TypeCriteriaException ) {
sb.append( " \n describe : " ) ;
sb.append( "无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机" ) ;
}
sb.append( " \n locationdescribe : " ) ;
sb.append(location.getLocationDescribe()) ; // 位置语义化信息
List<Poi> list = location.getPoiList() ; // POI数据
if (list != null ) {
sb.append( " \n poilist size = : " ) ;
sb.append(list.size()) ;
for (Poi p : list) {
sb.append( " \n poi= : " ) ;
sb.append(p.getId() + " " + p.getName() + " " + p.getRank()) ;
}
}
if (location.getLocType()== 61 ||location.getLocType()== 161 ||location.getLocType()== 66 )
{
//定位成功
Log.i( "info" , sb+ "" ) ;
currentUrl = urL +location.getLongitude()+ "&lat=" +location.getLatitude()+ "&key=898d29f0c1d54373a030b09704323cea" ;
new WeatherAsyncTask().execute( currentUrl ) ;
currentUrl = "" ;
}
else
{
//定位失败
}
mLocationClient .stop() ;
}
}
* 主页面,Weather
* Created by Administrator on 2016/5/5.
*/
public class WeatherFragment extends Fragment {
private View weatherView ;
//百度地图定位
public LocationClient mLocationClient = null;
public BDLocationListener myListener = new MyLocationListener() ;
//获取数据的url
private static final String urL = "http://apis.haoservice.com/weather/geo?lon=" ;
private String currentUrl ;
@Nullable
@Override
public View onCreateView (LayoutInflater inflater , @Nullable ViewGroup container , @Nullable Bundle savedInstanceState) {
weatherView =inflater.inflate(R.layout. fragment_weather , container ,false ) ;
mLocationClient = new LocationClient(getActivity()) ; //声明LocationClient类
mLocationClient .registerLocationListener( myListener ) ; //注册监听函数
initLocation() ;
mLocationClient .start() ;
return weatherView ;
}
@Override
public void onResume () {
super .onResume() ;
}
/**
* 配置定位SDK参数
*/
private void initLocation (){
LocationClientOption option = new LocationClientOption() ;
option.setLocationMode(LocationClientOption.LocationMode. Hight_Accuracy
) ; //可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
option.setCoorType( "bd09ll" ) ; //可选,默认gcj02,设置返回的定位结果坐标系
int span= 1000 ;
option.setScanSpan(span) ; //可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
option.setIsNeedAddress( true ) ; //可选,设置是否需要地址信息,默认不需要
option.setOpenGps( true ) ; //可选,默认false,设置是否使用gps
option.setLocationNotify( true ) ; //可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
option.setIsNeedLocationDescribe( true ) ; //可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
option.setIsNeedLocationPoiList( true ) ; //可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
option.setIgnoreKillProcess( false ) ; //可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
option.SetIgnoreCacheException( false ) ; //可选,默认false,设置是否收集CRASH信息,默认收集
option.setEnableSimulateGps( false ) ; //可选,默认false,设置是否需要过滤gps仿真结果,默认需要
mLocationClient .setLocOption(option) ;
}
/**
* 百度定位监听接口 BDLocationListener
*/
public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation (BDLocation location) {
//Receive Location
StringBuffer sb = new StringBuffer( 256 ) ;
sb.append( "time : " ) ;
sb.append(location.getTime()) ;
sb.append( " \n error code : " ) ;
sb.append(location.getLocType()) ;
sb.append( " \n latitude : " ) ;
sb.append(location.getLatitude()) ;
sb.append( " \n lontitude : " ) ;
sb.append(location.getLongitude()) ;
sb.append( " \n radius : " ) ;
sb.append(location.getRadius()) ;
if (location.getLocType() == BDLocation. TypeGpsLocation ) { // GPS定位结果
sb.append( " \n speed : " ) ;
sb.append(location.getSpeed()) ; // 单位:公里每小时
sb.append( " \n satellite : " ) ;
sb.append(location.getSatelliteNumber()) ;
sb.append( " \n height : " ) ;
sb.append(location.getAltitude()) ; // 单位:米
sb.append( " \n direction : " ) ;
sb.append(location.getDirection()) ; // 单位度
sb.append( " \n addr : " ) ;
sb.append(location.getAddrStr()) ;
sb.append( " \n describe : " ) ;
sb.append( "gps定位成功" ) ;
} else if (location.getLocType() == BDLocation. TypeNetWorkLocation ) { // 网络定位结果
sb.append( " \n addr : " ) ;
sb.append(location.getAddrStr()) ;
//运营商信息
sb.append( " \n operationers : " ) ;
sb.append(location.getOperators()) ;
sb.append( " \n describe : " ) ;
sb.append( "网络定位成功" ) ;
} else if (location.getLocType() == BDLocation. TypeOffLineLocation ) { // 离线定位结果
sb.append( " \n describe : " ) ;
sb.append( "离线定位成功,离线定位结果也是有效的" ) ;
} else if (location.getLocType() == BDLocation. TypeServerError ) {
sb.append( " \n describe : " ) ;
sb.append( "服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因" ) ;
} else if (location.getLocType() == BDLocation. TypeNetWorkException ) {
sb.append( " \n describe : " ) ;
sb.append( "网络不同导致定位失败,请检查网络是否通畅" ) ;
} else if (location.getLocType() == BDLocation. TypeCriteriaException ) {
sb.append( " \n describe : " ) ;
sb.append( "无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机" ) ;
}
sb.append( " \n locationdescribe : " ) ;
sb.append(location.getLocationDescribe()) ; // 位置语义化信息
List<Poi> list = location.getPoiList() ; // POI数据
if (list != null ) {
sb.append( " \n poilist size = : " ) ;
sb.append(list.size()) ;
for (Poi p : list) {
sb.append( " \n poi= : " ) ;
sb.append(p.getId() + " " + p.getName() + " " + p.getRank()) ;
}
}
if (location.getLocType()== 61 ||location.getLocType()== 161 ||location.getLocType()== 66 )
{
//定位成功
Log.i( "info" , sb+ "" ) ;
currentUrl = urL +location.getLongitude()+ "&lat=" +location.getLatitude()+ "&key=898d29f0c1d54373a030b09704323cea" ;
new WeatherAsyncTask().execute( currentUrl ) ;
currentUrl = "" ;
}
else
{
//定位失败
}
mLocationClient .stop() ;
}
}
}