基於百度地圖實現Android定位功能實現(詳解+教程)

初始化

(一)獲取到SHA1

首先你得註冊和獲取密鑰,這裏就直接參考百度地圖的教程即可

鏈接: 註冊.
這裏,我想重點說的是獲取sha1,(因爲小編就是在這花了很多時間)。
我們以Android studio爲例,

(1)找到View中的Tool Windows並打開Terminal

在這裏插入圖片描述

(2)找到你的jdk的bin目錄,小編這裏是 C:\Program Files\Java\jdk1.8.0_131\bin,

再Android studio控制檯下方輸入 cd C:\Program Files\Java\jdk1.8.0_131\bin
然後輸入keytool -list -v -keystore 目錄+debug.keystore(這裏的目錄通常是在用戶名下面的.android文件夾下面)
在這裏插入圖片描述

(3)輸入口令:調試模式下,口令爲android(這裏大家直接輸入android就ok)

(4)獲取到sha1

在這裏插入圖片描述

(二)Android studio 配置

(1)下載百度地圖sdk

傳送門: 百度地圖sdk.
在這裏插入圖片描述
這裏小編只下載這些,這個開發包根據個人需求來選擇。

(2)解壓安裝包

在這裏插入圖片描述

(3)將BaiduLBS_Android jar包放入project的lib目錄當中

注意:一定要是project模式下
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20200626124426718.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1MzUzODIz,size_16,color_FFFFFF,t_

(4)再src的main目錄下新建一個文件夾jniLibs(一定要是這個名字)

在這裏插入圖片描述

(5)將解壓包中的文件夾全部拷貝到jniLibs這裏

在這裏插入圖片描述

(6)回到剛剛配置的jar包,右擊點擊Add as library

在這裏插入圖片描述
這裏我們就可以build.gradle下看見,已經幫我們自動添加依賴
在這裏插入圖片描述
好啦,整個配置工作已經完成,下面我們就來實現定位吧!

定位功能實現

(1)配置一些信息

第一步 配置AndroidManifest.xml文件
1.在中加入如下代碼配置開發密鑰(AK)

<application>  
    <meta-data  
        android:name="com.baidu.lbsapi.API_KEY"  
        android:value="your key" />  //一定是你申請好的key
</application>

在這裏插入圖片描述

(2)添加權限

  <!-- 百度地圖需要的權限 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- 這個權限用於進行網絡定位-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
    <!-- 這個權限用於訪問GPS定位-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
    <!-- 用於讀取手機當前的狀態-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>

    <!-- 訪問網絡,進行地圖相關業務數據請求,包括地圖數據,路線規劃,POI檢索等 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 獲取網絡狀態,根據網絡狀態切換進行數據請求網絡轉換 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <!-- 讀取外置存儲。如果開發者使用了so動態加載功能並且把so文件放在了外置存儲區域,則需要申請該權限,否則不需要 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <!-- 寫外置存儲。如果開發者使用了離線地圖,並且數據寫在外置存儲區域,則需要申請該權限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

這裏我把所有可能用到的權限都加上了。
在這裏插入圖片描述

(3)在佈局中添加百度的mapview視圖控件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >



    <com.baidu.mapapi.map.MapView
        android:id="@+id/baiduMapView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:clickable="true" />
</LinearLayout>

(3)編寫java代碼

需要一個 Application(自己創一個類,繼承 Application),具體參考官方的文檔效果會好一點。

import com.baidu.mapapi.CoordType;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.MapView;

public class DemoApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        //在使用SDK各組件之前初始化context信息,傳入ApplicationContext
        SDKInitializer.initialize(this);
        //自4.3.0起,百度地圖SDK所有接口均支持百度座標和國測局座標,用此方法設置您使用的座標類型.
        //包括BD09LL和GCJ02兩種座標,默認是BD09LL座標。
        SDKInitializer.setCoordType(CoordType.BD09LL);

    }
}

創建一個activity

import android.app.Activity;
import android.location.LocationListener;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.util.Log;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BaiduMapOptions;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationData;

import java.util.List;
public class MapActivity extends Activity {
    private MapView mMapView = null;
    BaiduMap mBaiduMap=null;
    LocationClient mLocationClient=null;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
        //獲取地圖控件引用
        mMapView = (MapView) findViewById(R.id.baiduMapView);
        //獲取到地圖
         mBaiduMap = mMapView.getMap();
        //設置地圖放大的倍數
         init();
     //設置地圖定位的一些參數,如定位圖標,精度圈顏色等
        configure();
        //定位初始化
        init_location();

    }
    @Override
    protected void onResume() {
        mMapView.onResume();
        super.onResume();
    }

    @Override
    protected void onPause() {
        mMapView.onPause();
        super.onPause();
    }

    @Override
    protected void onDestroy() {
        mLocationClient.stop();
        mBaiduMap.setMyLocationEnabled(false);
        mMapView.onDestroy();
        mMapView = null;
        super.onDestroy();
    }
    /**
     * 繼承抽象類BDAbstractListener並重寫其onReceieveLocation方法來獲取定位數據,並將其傳給MapView。
     */
    public class MyLocationListener extends BDAbstractLocationListener {
        @Override
        public void onReceiveLocation(BDLocation location) {
            //mapView 銷燬後不在處理新接收的位置
            if (location == null || mMapView == null){
                return;
            }
            MyLocationData locData = new MyLocationData.Builder()
                    .accuracy(location.getRadius())
                    // 此處設置開發者獲取到的方向信息,順時針0-360
                    .direction(location.getDirection()).latitude(location.getLatitude())
                    .longitude(location.getLongitude()).build();
            mBaiduMap.setMyLocationData(locData);
        }
    }

    /**
     *    設置地圖放大的倍數
     */
    public  void init(){
        //設置地圖放大的倍數
        MapStatus.Builder  builder=new MapStatus.Builder();
        builder.zoom(18f);
        mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
    }

    /**
     * 自定義內容:
     * 參數說明
     * (1)定位模式 地圖SDK支持三種定位模式:NORMAL(普通態), FOLLOWING(跟隨態), COMPASS(羅盤態)
     * (2)是否開啓方向
     * (3)自定義定位圖標 支持自定義定位圖標樣式,
     * (4)自定義精度圈填充顏色
     * (5)自定義精度圈邊框顏色
     */
    public void configure(){
        mBaiduMap.setMyLocationConfiguration(new MyLocationConfiguration(MyLocationConfiguration.LocationMode.FOLLOWING,true,
                BitmapDescriptorFactory.fromResource(R.drawable.icon_gcoding),
                0xAAFFFF88,0xAA00FF00));
    }

    /**
     * 定位的初始化
     */
    public void init_location(){
        mBaiduMap.setMyLocationEnabled(true);
        mLocationClient = new LocationClient(MapActivity.this);
//通過LocationClientOption設置LocationClient相關參數
        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true); // 打開gps
        option.setCoorType("bd09ll"); // 設置座標類型
        option.setScanSpan(1000);
//設置locationClientOption
        mLocationClient.setLocOption(option);
//註冊LocationListener監聽器
        MyLocationListener myLocationListener = new MyLocationListener();
        mLocationClient.registerLocationListener(myLocationListener);
//開啓地圖定位圖層
        mLocationClient.start();
    }


}

(4)整體佈局如下:

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

總結和注意事項:

大家可以通過一個按鈕點擊事件來跳轉到你寫的定位的activity當中,這裏的定位activity大家直接拿去用就行了。這裏需要讓你在手機裏安裝的app,有定位服務,不然就定位不了啦!
在這裏插入圖片描述
實現的效果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章