簡單按步驟即可實(shí)現(xiàn)定位功能:
1.下載百度地圖SDK基礎(chǔ)定位
將SO文件的壓縮文件解壓出來,把對(duì)應(yīng)架構(gòu)下的SO文件放入開發(fā)者自己APP的對(duì)應(yīng)架構(gòu)下的文件夾中(建議全部放入以提高程序兼容性);將JAR文件拷貝到工程的libs目錄下,這樣即可在程序中使用Android定位SDK。
在build.gradle中配置SO文件的使用,如下所示:
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
2.設(shè)置AndroidManifest.xml
聲明使用權(quán)限
<!-- 這個(gè)權(quán)限用于進(jìn)行網(wǎng)絡(luò)定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!-- 這個(gè)權(quán)限用于訪問GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!-- 用于訪問wifi網(wǎng)絡(luò)信息,wifi信息會(huì)用于進(jìn)行網(wǎng)絡(luò)定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!-- 獲取運(yùn)營商信息,用于支持提供運(yùn)營商信息相關(guān)的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!-- 這個(gè)權(quán)限用于獲取wifi的獲取權(quán)限,wifi信息會(huì)用來進(jìn)行網(wǎng)絡(luò)定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!-- 用于讀取手機(jī)當(dāng)前的狀態(tài)-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<!-- 寫入擴(kuò)展存儲(chǔ),向擴(kuò)展卡寫入數(shù)據(jù),用于寫入離線定位數(shù)據(jù)-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!-- 訪問網(wǎng)絡(luò),網(wǎng)絡(luò)定位需要上網(wǎng)-->
<uses-permission android:name="android.permission.INTERNET" />
<!-- SD卡讀取權(quán)限,用戶寫入離線定位數(shù)據(jù)-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
在Application標(biāo)簽中聲明SERVICE組件并添加百度密鑰
<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="PUNGOv0mnOPLjCl04XAwK4CsbGPOjsa4" /> //key:開發(fā)者申請(qǐng)的Key(填寫自己申請(qǐng)的key)
3.下面是封裝好的百度定位的工具類
/**
* 百度地圖定位工具類
*
* @author LiuFeng
* @date 2017-7-22
*/
public class BdLocationUtil {
/**
* 單例
*
* @return
*/
public static BdLocationUtil getInstance() {
return LocationHolder.INSTANCE;
}
private static class LocationHolder {
private static final BdLocationUtil INSTANCE = new BdLocationUtil();
}
private BdLocationUtil() {
}
/**
* 定位回調(diào)的接口
*/
public interface MyLocationListener {
void myLocation(BDLocation location);
}
/**
* 獲取當(dāng)前位置
*/
public void requestLocation(final MyLocationListener listener) {
//聲明LocationClient類
final LocationClient locationClient = new LocationClient(App.getContext());
// 設(shè)置定位條件
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true); // 是否打開GPS
option.setCoorType("bd09ll"); // 設(shè)置返回值的坐標(biāo)類型
option.setScanSpan(10000); // 設(shè)置定時(shí)定位的時(shí)間間隔。單位毫秒
option.setIsNeedAddress(true); //可選,設(shè)置是否需要地址信息,默認(rèn)不需要
option.setIgnoreKillProcess(false); //可選,默認(rèn)true,定位SDK內(nèi)部是一個(gè)SERVICE,并放到了獨(dú)立進(jìn)程,設(shè)置是否在stop的時(shí)候殺死這個(gè)進(jìn)程,默認(rèn)不殺死
locationClient.setLocOption(option);
// 注冊(cè)位置監(jiān)聽器
locationClient.registerLocationListener(new BDAbstractLocationListener() {
@Override
public void onReceiveLocation(BDLocation location) {
listener.myLocation(location);
locationClient.stop();
}
});
locationClient.start();
/*
* 當(dāng)所設(shè)的整數(shù)值大于等于1000(ms)時(shí),定位SDK內(nèi)部使用定時(shí)定位模式。調(diào)用requestLocation(
* )后,每隔設(shè)定的時(shí)間,定位SDK就會(huì)進(jìn)行一次定位。如果定位SDK根據(jù)定位依據(jù)發(fā)現(xiàn)位置沒有發(fā)生變化,就不會(huì)發(fā)起網(wǎng)絡(luò)請(qǐng)求,
* 返回上一次定位的結(jié)果;如果發(fā)現(xiàn)位置改變,就進(jìn)行網(wǎng)絡(luò)請(qǐng)求進(jìn)行定位,得到新的定位結(jié)果。
* 定時(shí)定位時(shí),調(diào)用一次requestLocation,會(huì)定時(shí)監(jiān)聽到定位結(jié)果。
*/
locationClient.requestLocation();
}
}
4.將以下代碼放入需要定位的Activity中,在onCreate()方法中調(diào)用myPermissionRequest()方法即可,以上工作準(zhǔn)備好就可以使用啦
/**
* 動(dòng)態(tài)請(qǐng)求權(quán)限,安卓手機(jī)版本在5.0以上時(shí)需要
*/
private void myPermissionRequest() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// 檢查是否擁有權(quán)限,申請(qǐng)一個(gè)(或多個(gè))權(quán)限,并提供用于回調(diào)返回的獲取碼(用戶定義)
if (this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[] {
Manifest.permission.ACCESS_COARSE_LOCATION
}, BAIDU_ACCESS_COARSE_LOCATION);
}
else {
// 已擁有權(quán)限,作相應(yīng)處理(調(diào)用定位SDK應(yīng)當(dāng)確保相關(guān)權(quán)限均被授權(quán),否則可能引起定位失?。? myLocation();
}
}else {
// 安卓手機(jī)版本在5.0時(shí),配置清單中已申明權(quán)限,作相應(yīng)處理,此處正對(duì)sdk版本低于23的手機(jī)
myLocation();
}
}
/**
* 百度地圖定位的請(qǐng)求方法 拿到 國 省 市 區(qū)
*/
private void myLocation() {
BdLocationUtil.getInstance().requestLocation(new BdLocationUtil.MyLocationListener() {
@Override
public void myLocation(BDLocation location) {
if (location == null) {
return;
}
if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
String mCounty = location.getCountry(); //獲取國家
String mProvince = location.getProvince(); //獲取省份
String mCity = location.getCity(); //獲取城市
String mDistrict = location.getDistrict(); //獲取區(qū)
Log.i("==requestLocation===", "myLocation: "+mCounty+"="+mProvince+"="+mCity+"="+mDistrict);
}
}
});
}
/**
* 權(quán)限請(qǐng)求的返回結(jié)果
*
* @param requestCode
* @param permissions
* @param grantResults
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
// requestCode即所聲明的權(quán)限獲取碼,在checkSelfPermission時(shí)傳入
case BAIDU_ACCESS_COARSE_LOCATION:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 第一次獲取到權(quán)限,請(qǐng)求定位
myLocation();
}
else {
// 沒有獲取到權(quán)限,做特殊處理
Log.i("=========", "請(qǐng)求權(quán)限失敗");
}
break;
default:
break;
}
}
是不是特別簡單啊,完成啦啦啦···