1.为什么要写这个呢?
因为用的地方多啊,这个还用说!但网上的不是太老,就是太复杂了,包含很多不需要的东西!
2.本demo有哪些干货?
只有一个功能:就是定位,定位到当前城市!
1.第一步:当然是下载相关sdk啊,我只需要定位功能,不想做的太臃肿!如图:
下载下来大概只有372KB,解压出来后有一个jar文件,其他的都是各种处理器的.so文件,如果是eclipse:全部放在libs下面即可!
如果你和我一样使用的是Android Studio1.5正式版的话,就先要把jar包引入,再把.so文件引入~!
jar包引入大家都懂,.so文件引入不得不说Android Studio就要麻烦一些,需要在当前项目的build.gradle里面加入如下配置:
这就是第一步啦,下载sdk并引入相关jar和所有.so文件~!
2.第二步:得到appkey并配置
在百度开放平台的里面创建相关应用,完成后就可以得到key值了,
a.然后在application里面加入相关配置
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="你得到的AK说" />
b.并加入相关权限
<!-- 这个权限用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 这个权限用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
<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" />
<!-- SD卡读取权限,用户写入离线定位数据 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
第二步,也就完成了,下面开始最后一步~!
3.第三步:写代码,我是单独提出来的一个类,用的时候实例化这个类并监听就可以得到相关定位信息了~! 代码如下:
package com.cq.cake.baidu;
import android.content.Context;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
/**
* Created by Small Cake on 2015/12/16.
*/
public class MyBaiduLocation {
private LocationClient client;// 百度定位客户端
private LocationEndListener listener;
private static MyBaiduLocation mBaiduLocation;
private MyBaiduLocation(Context context){
initBaiDuMapLocation(context);
}
/**
* 获取实例
* @return
*/
public static MyBaiduLocation getInstance(Context context){
if (mBaiduLocation!=null){
return mBaiduLocation;
}else{
mBaiduLocation = new MyBaiduLocation(context);
return mBaiduLocation;
}
}
public interface LocationEndListener{
void endLocation(BDLocation location);
}
public void setLocationEndListener(LocationEndListener listener){
this.listener = listener;
}
/**
* 百度地图定位
*/
private void initBaiDuMapLocation(Context context) {
//1.申明百度定位客户端
client = new LocationClient(context.getApplicationContext());
// 2.申明和注册监听函数
client.registerLocationListener(new MyBDLocationListener());
// 3.设置地图定位相关参数
client.setLocOption(getLocationClientOption());
// 4.开启客户端定位
client.start();
}
class MyBDLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
if (listener!=null)
listener.endLocation(location);
}
}
/**
* 获取地图定位相关参数
*
* @return LocationClientOption
*/
private LocationClientOption getLocationClientOption() {
LocationClientOption option = new LocationClientOption();
// Hight_Accuracy高精度、Battery_Saving低功耗、Device_Sensors仅设备(GPS)
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);// 设置高精度定位模式
option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02
option.setScanSpan(1000 * 60 * 10);// 设置的扫描间隔,单位是毫秒
option.setIsNeedAddress(true);// 返回的定位结果包含地址信息
option.setAddrType("all");// String 值为 all时,表示返回地址信息,其他值都表示不返回地址信息。
option.setNeedDeviceDirect(true);// 返回的定位结果包含手机机头的方向
option.setOpenGps(true);// 设置打开GPS
return option;
}
}
到这里百度地图定位的使用就写完了,如何使用呢:在需要定位的Activity中加入如下代码:
MyBaiduLocation mLocation = MyBaiduLocation.getInstance(MainActivity.this);
mLocation.setLocationEndListener(new MyBaiduLocation.LocationEndListener() {
@Override
public void endLocation(BDLocation location) {
String mCity = location.getProvince();
itemCity.setTitle(mCity);
queryWeather(mCity);
}
});
其实也不复杂,就三步就可以实现定位功能的使用,官方文档还加入service什么的,对我没用,我只需要定位到当前城市就可以了!
希望对也是这个需求的同学有一点帮助,大家多多交流~!