Android百度地圖——定位(已封裝)

簡單按步驟即可實(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;
        }
    }

是不是特別簡單啊,完成啦啦啦···

源碼下載,請(qǐng)點(diǎn)擊這里

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容