1. 程式人生 > >百度地圖SDK配置與使用

百度地圖SDK配置與使用

在配置百度地圖 SDK 和使用時,發現官網上的教程並不是那麼好用,而且容易出現定位回撥裡 BDLocation.getLocType() == 162 這個問題,官網只是說 SO 配置出現異常,並沒有明確問題所在;如果你也遇到了,請點這個連結:BDLocation.getLocType() == 162;下面是在官網的步驟,其中我畫紅圈的是必須要看的:獲取金鑰,開發指南,產品下載。

先看一下效果圖,可以直接獲取到我的位置資訊:

GitHub 下載地址:https://github.com/wuqingsen/getLocation

CSDN 下載地址:https://download.csdn.net/download/wuqingsen1/10827318

1. 開啟百度地圖 SDK 官網,登陸/註冊

開啟百度地圖 SDK 官網,登陸/註冊;官網是:http://lbsyun.baidu.com/index.php?title=android-locsdk

一定要登陸/註冊,否則下面獲取金鑰無法進行;

2.獲取金鑰

點選獲取金鑰,會出現下面的頁面:

點選建立應用,就可以建立自己的應用,如下圖:

應用名稱可以根據自己喜好起名字,應用型別在這裡選擇的是 Android SDK ,啟動服務預設全選,SHA1的獲取可以點這裡看如何獲取包名的檢視可以點選這裡;當然也可以看官網的介紹。這些操作完後,就可以點選提交了,這樣就獲取到金鑰了。

3.下載jar包

點選產品下載,點選去下載,如下圖:

可以根據自己需要下載,我下載的只是定位能力的 jar 包,如下圖:

下載解壓後,開啟後會看到下面圖片的內容:

將 jar 包複製到專案的 libs 中,再建立 jniLibs 的包是和 java 包同級的,這裡是和官網配置不怎麼一樣,因為按照官網的配置,會出現 162 的錯誤,而用下面的方式可以避免錯誤;如下圖:

建立完之後,就配置完成了,這裡就不用再取配置 Gradle 了。

4. AndroidManfest 的配置

新增程式碼這部分,官網的開發指南說的很清楚了,我也不再多寫了。在新增程式碼前,需要配置許可權,下面是一個 app 正常執行都要配置的內容,懶得抽出來寫百度地圖的配置,所以直接拿過來了~~:

    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.REORDER_TASKS" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />

    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.FLASHLIGHT" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.SEND_DOWNLOAD_COMPLETED_INTENTS" />
    <!-- 訪問網路的許可權 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.READ_LOGS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
    <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />

    <uses-feature android:name="android.hardware.location.gps" />

    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <!-- 閱讀訊息 -->
    <uses-permission android:name="android.permission.READ_SMS" />
    <!-- 寫入訊息 -->
    <uses-permission android:name="android.permission.WRITE_SMS" />
    <!-- 接收訊息 -->
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <!-- iBeancon功能所需許可權 -->
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

下面是 application 內的配置,其中 API_KEY 為自己申請的金鑰~~,不要填錯了:

    <application
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <!-- 百度定位 開始 -->
        <service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote" />
        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="YKdeW7z3YqOrO2yjvVSMbYdBgccvPGK8" />
        <!-- 百度定位 結束 -->
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

到此為止 AndroidManfest 的配置也完成了;

5. 寫入獲取地理為止的程式碼~就OK了

寫入程式碼之前要先申請一些許可權~~,如:獲取地理為止等,下面是我自己寫的獲取許可權的工具類:

import android.content.Context;
import android.content.pm.PackageManager;
import android.support.v4.content.ContextCompat;

/**
 * author: wu
 * date: on 2018/11/30.
 * describe:檢查許可權的工具類
 */

public class PermissionsChecker {
    private final Context mContext;

    public PermissionsChecker(Context context) {
        mContext = context.getApplicationContext();
    }

    // 判斷許可權集合
    public boolean lacksPermissions(String... permissions) {
        for (String permission : permissions) {
            if (lacksPermission(permission)) {
                return true;
            }
        }
        return false;
    }

    // 判斷是否缺少許可權
    private boolean lacksPermission(String permission) {
        return ContextCompat.checkSelfPermission(mContext, permission) ==
                PackageManager.PERMISSION_DENIED;
    }
}

下面就是 MainActivity 的主要程式碼了:

import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;

public class MainActivity extends AppCompatActivity {
    private PermissionsChecker mPermissionsChecker; // 許可權檢測器
    private final int RESULT_CODE_LOCATION = 0x001;
    private Button btn_getPlace;
    //定位許可權,獲取app內常用許可權
    String[] permsLocation = {"android.permission.READ_PHONE_STATE"
            , "android.permission.ACCESS_COARSE_LOCATION"
            , "android.permission.ACCESS_FINE_LOCATION"
            , "android.permission.READ_EXTERNAL_STORAGE"
            , "android.permission.WRITE_EXTERNAL_STORAGE"};
    LocationClient mLocClient;
    private TextView tv_place;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_getPlace = findViewById(R.id.btn_getPlace);
        tv_place = findViewById(R.id.tv_place);
        mPermissionsChecker = new PermissionsChecker(MainActivity.this);
        mLocClient = new LocationClient(getApplicationContext());
        mLocClient.registerLocationListener(listener);

        btn_getPlace.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mPermissionsChecker.lacksPermissions(permsLocation)) {
                    ActivityCompat.requestPermissions(MainActivity.this, permsLocation, RESULT_CODE_LOCATION);
                } else {
                    //獲取位置
                    setLocation();
                }
            }
        });
    }

    //獲取位置
    private void setLocation() {
        LocationClientOption option = new LocationClientOption();
        option.setIsNeedAddress(true);//是否要地址
        option.setOpenGps(true);
        option.setCoorType("bd09ll"); // 設定座標型別
        option.setScanSpan(1000);//可選,預設0,即僅定位一次,設定發起連續定位請求的間隔需要大於等於1000ms才是有效的
        mLocClient.setLocOption(option);
        mLocClient.start();
    }

    /***
     * 定位結果回撥,在此方法中處理定位結果
     */
    BDAbstractLocationListener listener = new BDAbstractLocationListener() {
        @Override
        public void onReceiveLocation(BDLocation bdLocation) {

            Log.i("bdmap", "定位型別:" + bdLocation.getLocTypeDescription() + "\n"
                    + "緯度:" + bdLocation.getLatitude() + "\n"
                    + "經度:" + bdLocation.getLongitude() + "\n"
                    + "詳細地址:" + bdLocation.getAddrStr() + "\n"
                    + "衛星數目" + bdLocation.getSatelliteNumber());
            //設定我的位置
            tv_place.setText(bdLocation.getAddrStr());
        }
    };

    @Override
    public void onRequestPermissionsResult(int permsRequestCode, String[] permissions, int[] grantResults) {
        switch (permsRequestCode) {
            case RESULT_CODE_LOCATION:
                boolean cameraAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED;
                if (cameraAccepted) {
                    //許可權通過後繼續獲取位置
                    setLocation();
                } else {
                    //使用者授權拒絕之後,友情提示一下
                    Toast.makeText(MainActivity.this, "請開啟應用定位許可權", Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }
}

不難看出,和百度官方的所給的程式碼所差無幾,只是在裡面多加了許可權的判斷,沒有許可權時,去申請許可權。最後的 onRequestPermissionsResult 方法中,再去判斷有沒有許可權,如果申請到了許可權繼續獲取位置。

到這裡百度地圖 SDK 的基本使用就完成了~~~