百度地圖SDK的簡單接入

一、 申請(qǐng)API_KEY

1. http://lbsyun.baidu.com/ :在這里注冊(cè)并申請(qǐng)。注冊(cè)之后出現(xiàn)應(yīng)用列表,選擇 創(chuàng)建應(yīng)用

創(chuàng)建應(yīng)用

2. 創(chuàng)建應(yīng)用后如下圖所示:

選擇
  • 應(yīng)用類型選擇的話,我們選擇 Android SDK 就可以了。
SHA1

PS:SHA1找了我好久...

  • SHA1尋找之路:
    左側(cè)選擇項(xiàng)目目錄類型 project ,打開右側(cè) Gradle > app > android > signingReport ,點(diǎn)擊發(fā)現(xiàn)空白,突然發(fā)現(xiàn)左下角有個(gè)轉(zhuǎn)換的鍵(左下標(biāo)紅的地方),答案出來了。

3. 獲取基本參數(shù)

  • 創(chuàng)建完成,獲得API_KEY

二、 下載百度定位SDK

  • 如無特殊要求,選擇基礎(chǔ)功能即可:
  • 下載開發(fā)包解壓后得到 libs 文件夾。
  • BaiduLBS_android.jar 放在 project 目錄下的 app > libs 目錄下,其他so庫放在 app > main > 新建文件夾jniLibs 下,或者都可以放jniLibs下。

三、 使用百度地圖

1. 在 AndroidManifest.xml 中添加如下權(quán)限:

<!-- 這個(gè)權(quán)限用于進(jìn)行網(wǎng)絡(luò)定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!-- 這個(gè)權(quán)限用于訪問GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!-- 用于訪問wifi網(wǎng)絡(luò)信息,wifi信息會(huì)用于進(jìn)行網(wǎng)絡(luò)定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!-- 獲取運(yùn)營商信息,用于支持提供運(yùn)營商信息相關(guān)的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- 這個(gè)權(quán)限用于獲取wifi的獲取權(quán)限,wifi信息會(huì)用來進(jìn)行網(wǎng)絡(luò)定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<!-- 用于讀取手機(jī)當(dāng)前的狀態(tài)-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!-- 寫入擴(kuò)展存儲(chǔ),向擴(kuò)展卡寫入數(shù)據(jù),用于寫入離線定位數(shù)據(jù)-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 訪問網(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"/>
  • Application標(biāo)簽中聲明SERVICE組件,每個(gè)APP擁有自己單獨(dú)的定位SERVICE
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"/>
  • 百度定位SDK在4.2版本之后需要在 AndroidMainfest.xml 中正確設(shè)置Accesskey(AK),如果設(shè)置錯(cuò)誤將會(huì)導(dǎo)致定位和地理圍欄服務(wù)無法正常使用。設(shè)置AK,在Application標(biāo)簽中加入:
<meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="AK" />       //AK:開發(fā)者申請(qǐng)的Key

2. 新建LBSwithBaidu,LBSwithBaidu代碼如下:

public class LBSwithBaidu extends AppCompatActivity {
      private TextView text;
      private LocationClient client;
      private  StringBuilder connrentPosition;
      private MapView map;
      private BaiduMap baidumap;
      private boolean ismylocation=true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //SDK的初始化
        SDKInitializer.initialize(getApplicationContext());
        //注冊(cè)客戶端定位的監(jiān)聽
        client = new LocationClient(getApplicationContext());
        client.registerLocationListener(new MylocationListener());

        setContentView(R.layout.activity_lbswith_baidu);
        text= (TextView) findViewById(R.id.textView_location);
        //獲取地圖控件的引用  
        map= (MapView) findViewById(R.id.mapwithbaidu);
        //獲取地圖實(shí)例
        baidumap=map.getMap();
        //設(shè)置是否在地圖上顯示位置
        baidumap.setMyLocationEnabled(true);
        //6.0以上動(dòng)態(tài)權(quán)限的獲取
        List<String> permission = new ArrayList<>();
        if (ContextCompat.checkSelfPermission(LBSwithBaidu.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            permission.add(Manifest.permission.ACCESS_FINE_LOCATION);
        }
        if (ContextCompat.checkSelfPermission(LBSwithBaidu.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
            permission.add(Manifest.permission.READ_PHONE_STATE);
        }
        if (ContextCompat.checkSelfPermission(LBSwithBaidu.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            permission.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
        }
      
        if (!permission.isEmpty()) {
            String[] permissions = permission.toArray(new String[permission.size()]);
            ActivityCompat.requestPermissions(LBSwithBaidu.this, permissions, 1);

        } else {
            requestion();
        }

    }

    private void requestion() {
        initlocation();
        client.start();
    }

    private void initlocation() {
        LocationClientOption option=new LocationClientOption();
        option.setIsNeedAddress(true);
        option.setScanSpan(5000);
        client.setLocOption(option);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case 1:
                if (grantResults.length > 0) {
                    for(int result:grantResults){
                        if(result!=PackageManager.PERMISSION_GRANTED){
                            Toast.makeText(this, "必須同意權(quán)限", Toast.LENGTH_SHORT).show();
                            finish();
                            return;
                        }
                    }
                    requestion();
                }else {
                    Toast.makeText(this, "發(fā)生錯(cuò)誤", Toast.LENGTH_SHORT).show();
                }
                break;
            default:
        }
    }

    public void nagativato(BDLocation bdLocation) {
        if (ismylocation) {
            LatLng ll = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());
            Log.d("pipa",bdLocation.getLatitude()+"::"+ bdLocation.getLongitude());
            MapStatusUpdate updata = MapStatusUpdateFactory.newLatLng(ll);
            baidumap.animateMapStatus(updata);
            updata = MapStatusUpdateFactory.zoomTo(16f);
            baidumap.animateMapStatus(updata);
            ismylocation = false;

        }
        MyLocationData.Builder loBuilder=new MyLocationData.Builder().latitude(bdLocation.getLatitude())
                .longitude(bdLocation.getLongitude());
        MyLocationData locationData=loBuilder.build();
        baidumap.setMyLocationData(locationData);

    }

    public class MylocationListener implements BDLocationListener {


        @Override
        public void onReceiveLocation(BDLocation bdLocation) {
           String name =  bdLocation.getLocType();   
           if(name==BDLocation.TypeGpsLocation||name==BDLocation.TypeNetWorkLocation){
                nagativato(bdLocation);
            }

            connrentPosition = new StringBuilder();
            connrentPosition.append("緯度:").append(bdLocation.getLatitude()).append("\n");
            connrentPosition.append("經(jīng)度:").append(bdLocation.getLongitude()).append("\n");
            connrentPosition.append("國家:").append(bdLocation.getCountry()).append("\n");
            connrentPosition.append("省:").append(bdLocation.getProvince()).append("\n");
            connrentPosition.append("市:").append(bdLocation.getCity()).append("\n");
            connrentPosition.append("縣:").append(bdLocation.getDistrict()).append("\n");
            connrentPosition.append("街道:").append(bdLocation.getStreet()).append("\n");
            connrentPosition.append("定位方式:");
            if (bdLocation.getLocType() == BDLocation.TypeGpsLocation) {
                connrentPosition.append("GPS");
            } else if (bdLocation.getLocType() == BDLocation.TypeNetWorkLocation) {
                connrentPosition.append("網(wǎng)絡(luò)定位");
            }
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    text.setText(connrentPosition);
                }
            });
        }
        @Override
        public void onConnectHotSpotMessage(String s, int i) {

        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        //地圖生命周期需實(shí)現(xiàn)
        map.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        //地圖生命周期需實(shí)現(xiàn)
        map.onPause();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        client.stop();
        //地圖生命周期需實(shí)現(xiàn)
        map.onDestroy();
        baidumap.setMyLocationEnabled(false);
    }
}

3. 最終效果圖:

如有不對(duì)之處,歡迎指正,謝謝~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容