百度地圖sdk使用


準備


登陸百度地圖開放平臺,注冊賬號,添加應用。添加應用時需要包名和SHA1碼,SHA1碼需要在項目的工程目錄下輸入如下指令,用自己的keystore替換debug.keystore
keytool -list -v -keystore debug.keystore
結果如下:

SHA1碼.png


配置


  1. 下載相關的資源包百度sdk下載
    (注意多試幾次,有些下載的不能用,有錯誤肯定在這兒!?。。。?/li>
  2. 將下載得到的所有文件放到app/libs目錄下,并且add dependence。


    添加百度jar包依賴.png

    添加完成后在bulid.gradle中添加sourceSets


    添加sourceSets.png

    完成后會在jniLibs中看到對應的文件
    jniLibs.png
  3. 在manifest中添加權限
    <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.WRITE_SETTINGS" />```
以及
    <meta-data   
        android:name="com.baidu.lbsapi.API_KEY"
        android:value="開發者 key"/>```
  1. 使用前需要在application中的onCreate時添加SDKInitializer.initialize(this);

初始化中心點


     /**
     * 初始化map中心點
     * @param latitude  中心點緯度
     * @param longitude 中心點經度
     */
    private void initMapCenter(double latitude, double longitude) {
        // 初始化搜索模塊,注冊事件監聽
        LatLng cenpt = new LatLng(latitude, longitude);
        //定義地圖狀態
        MapStatus mMapStatus = new MapStatus.Builder()
                .target(cenpt)
                .zoom(16)
                .build();
        MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);
        //改變地圖狀態
        mBaiduMap.setMapStatus(mMapStatusUpdate);
    }

添加圖釘


     /**
     * 添加圖釘
     * @param latitude  圖釘緯度
     * @param longitude 圖釘經度
     */
    private void addOverlay(double markerLatitude, double markerLongitude) {
        LatLng cenpt = new LatLng(markerLatitude, markerLongitude);
        //構建Marker圖標
        bd = BitmapDescriptorFactory
                .fromResource(R.drawable.icon_geo_blue);
        //構建MarkerOption,用于在地圖上添加Marker
        OverlayOptions option = new MarkerOptions()
                .position(cenpt)
                .icon(bd)
                .zIndex(9);//設置marker所在層級
        //在地圖上添加Marker,并顯示
        bdMarker = (Marker) (mBaiduMap.addOverlay(option));
    }

泡泡


泡泡指的是地圖上的marker點擊后顯示的內容,一般顯示該marker的詳細信息

     /**
     * 初始化泡泡窗口
     * @param marker 被點擊的marker點
     */
    private void initInfoWindow(final Marker marker) {
        LatLng latLng = marker.getPosition();
        view = View.inflate(this, R.layout.pop_window, null);
        infoWindow = new InfoWindow(view, latLng, -47);
        mBaiduMap.showInfoWindow(infoWindow);
    }

隱藏泡泡
mBaiduMap.hideInfoWindow()


百度定位


  1. 在Mainfest中添加service
        <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"> </service>
  1. LocationService
  /**
 * @author baidu
 */
public class LocationService {
    private LocationClient client = null;
    private LocationClientOption mOption;
    private LocationClientOption diyOption;
    private Object objLock = new Object();

    /***
     * @param locationContext
     */
    public LocationService(Context locationContext) {
        synchronized (objLock) {
            if (client == null) {
                client = new LocationClient(locationContext);
                client.setLocOption(getDefaultLocationClientOption());
            }
        }
    }
    /**
     * 注冊監聽
     * @param listener
     * @return
     */
    public boolean registerListener(BDLocationListener listener) {
        boolean isSuccess = false;
        if (listener != null) {
            client.registerLocationListener(listener);
            isSuccess = true;
        }
        return isSuccess;
    }
    /**
     * 反注冊監聽
     * @param listener
     */
    public void unregisterListener(BDLocationListener listener) {
        if (listener != null) {
            client.unRegisterLocationListener(listener);
        }
    }
    /***
     * @param option
     * @return isSuccessSetOption
     */
    public boolean setLocationOption(LocationClientOption option) {
        boolean isSuccess = false;
        if (option != null) {
            if (client.isStarted()) {
                client.stop();
            }
            diyOption = option;
            client.setLocOption(option);
            isSuccess = true;
        }
        return isSuccess;
    }
    public LocationClientOption getOption() {
        return diyOption;
    }
    /***
     * @return DefaultLocationClientOption
     */
    public LocationClientOption getDefaultLocationClientOption() {
        if (mOption == null) {
            mOption = new LocationClientOption();
            mOption.setLocationMode(LocationMode.Hight_Accuracy);//可選,默認高精度,設置定位模式,高精度,低功耗,僅設備
            mOption.setOpenGps(true); // 是否打開GPS
            mOption.setCoorType("bd09ll");//可選,默認gcj02,設置返回的定位結果坐標系,如果配合百度地圖使用,建議設置為bd09ll;
            mOption.setScanSpan(1000);//可選,默認0,即僅定位一次,設置發起定位請求的間隔需要大于等于1000ms才是有效的
            mOption.setIsNeedAddress(true);//可選,設置是否需要地址信息,默認不需要
            mOption.setIsNeedLocationDescribe(true);//可選,設置是否需要地址描述
            mOption.setNeedDeviceDirect(true);//可選,設置是否需要設備方向結果
            mOption.setLocationNotify(false);//可選,默認false,設置是否當gps有效時按照1S1次頻率輸出GPS結果
            mOption.setIgnoreKillProcess(true);
            //可選,默認true,定位SDK內部是一個SERVICE,并放到了獨立進程,設置是否在stop的時候殺死這個進程,默認不殺死
            mOption.setIsNeedLocationDescribe(true);//可選,默認false,設置是否需要位置語義化結果,可以在BDLocation
            // .getLocationDescribe里得到,結果類似于“在北京天安門附近”
            mOption.setIsNeedLocationPoiList(true);//可選,默認false,設置是否需要POI結果,可以在BDLocation
            // .getPoiList里得到
            mOption.SetIgnoreCacheException(false);//可選,默認false,設置是否收集CRASH信息,默認收集

            mOption.setIsNeedAltitude(false);//可選,默認false,設置定位時是否需要海拔信息,默認不需要,除基礎定位版本都可用
        }
        return mOption;
    }
    /**
     * 服務開始
     */
    public void start() {
        synchronized (objLock) {
            if (client != null && !client.isStarted()) {
                client.start();
            }
        }
    }
    /**
     * 服務停止
     */
    public void stop() {
        synchronized (objLock) {
            if (client != null && client.isStarted()) {
                client.stop();
            }
        }
    }
}
  1. locationservice實例化
       //獲取locationservice實例
        locationService = ((MicroBandApp) getApplication()).locationService;
        locationService.setLocationOption(locationService.getDefaultLocationClientOption());
        //注冊監聽
        locationService.registerListener(this);
        // 開始定位
        locationService.start();
  1. 監聽
    mBaiduMap.setMyLocationEnabled(true);
    在回調中獲取當前的經緯度和地址

@Override
public void onReceiveLocation(BDLocation bdLocation) {
// 只是完成了定位
if (bdLocation == null || binding.bmapView == null) {
return;
}
Log.d(TAG, "onReceiveLocation: " + bdLocation.getLatitude() + "::" + bdLocation
.getLongitude());
}

5. 停止定位
    locationService.unregisterListener(this); //注銷掉監聽
    locationService.stop(); //停止定位服務
***
#導航--從當前位置開始
***
1. 調用百度地圖進行導航

/**
* 調用百度地圖導航
* @param endLat
* @param endLon
*/
public void loadBaiduMap(double endLat,double endLon) {
if (isInstallByread("com.baidu.BaiduMap")) {
Intent intent = null;
try {
intent = Intent.getIntent("baidumap://map/direction?origin=我的位置"+
"&destination=" +endLat+","+endLon+
"&mode=transit&sy=3&index=0&target=1");
} catch (URISyntaxException e) {
Log.e("intent", e.getMessage());
}
this.context.startActivity(intent); //啟動調用
} else {
Toast.makeText(context, "請安裝百度地圖", Toast.LENGTH_SHORT).show();
}
}

2.  調用高德地圖進行導航

/**
* 調用高德地圖導航
* @param endLat
* @param endLon
*/
public void loadGaodeMap(double endLat,double endLon) {
if (isInstallByread("com.autonavi.minimap")) {
Intent intent = null;
try {
intent = Intent.getIntent("androidamap://route?sourceApplication=amap" +
"&dlat="+endLat+
"&dlon="+endLon+
"&dname=西溪新座&dev=0&t=1");
} catch (URISyntaxException e) {
Log.e("intent", e.getMessage());
}
this.context.startActivity(intent); //啟動調用
} else {
Toast.makeText(context, "請安裝高德地圖", Toast.LENGTH_SHORT).show();
}
}

3. 參數
如果需要從非當前位置開始導航,可查詢具體的參數設置
[百度URI API
](http://lbsyun.baidu.com/index.php?title=uri/api/android)

***
#定位服務
***
Android6.0以上定位服務的開啟不僅需要在manifest中定義,用戶還可以進行手動的開啟或關閉

public class LocationPermissionUtil {
private static AlertDialog mAlertDialog;
private static final int PERMISSION_REQUEST_CODE = 0;//系統權限管理頁面的參數

/**
 * Location service if enable
 *
 * @return location is enable if return true, otherwise disable.
 */
public static final boolean isLocationEnable(Context context) {
    LocationManager locationManager = (LocationManager) context.getSystemService(Context
            .LOCATION_SERVICE);
    boolean networkProvider = locationManager.isProviderEnabled(LocationManager
            .NETWORK_PROVIDER);
    boolean gpsProvider = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    if (gpsProvider) {
        return true;
    }
    return false;
}

/**
 * 檢查是否授予位置權限
 *
 * @return 權限檢查通過返回true,不通過返回false
 */
public static boolean checkLocationPermission(Activity activity) {
    // For Android < Android M, self permissions are always granted.
    boolean result = true;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (getTargetSdkVersion(activity) >= Build.VERSION_CODES.M) {
            // targetSdkVersion >= Android M
            result = checkPermissions(activity, Manifest.permission.ACCESS_COARSE_LOCATION,
                    Manifest.permission.ACCESS_FINE_LOCATION);
        } else {
            // targetSdkVersion < Android M
            result = selfPermissionGranted(activity, Manifest.permission.ACCESS_COARSE_LOCATION,
                    Manifest.permission.ACCESS_FINE_LOCATION);
        }
    }
    return result;
}

/**
 * 目標sdk版本
 */
private static int getTargetSdkVersion(Context context) {
    try {
        final PackageInfo info = context.getPackageManager().getPackageInfo(
                context.getPackageName(), 0);
        return info.applicationInfo.targetSdkVersion;
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    return 0;
}

/**
 * 進入服務設置界面
 * @param context
 */
public static void startSetting(final Context context) {
    mAlertDialog = new AlertDialog.Builder(context)
            .setTitle("定位服務未開啟")
            .setMessage("請在系統設置中開啟定位服務")
            .setNegativeButton("設置", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Intent locationIntent = new Intent(Settings
                            .ACTION_LOCATION_SOURCE_SETTINGS);
                    context.startActivity(locationIntent);
                }
            })
            .setPositiveButton("好的", null)
            .setCancelable(false)
            .show();
}


/**
 * targetSdkVersion < Android M
 * 檢查系統權限是否被授權
 *
 * @return 權限檢查通過返回true,不通過返回false
 */
public static boolean selfPermissionGranted(Context context, String... permissions) {
    List<String> lackPermissions = new ArrayList<>();
    for (String permission : permissions) {
        // targetSdkVersion < Android M, we have to use PermissionChecker
        if (PermissionChecker.checkSelfPermission(context, permission) != PackageManager
                .PERMISSION_GRANTED) {
            lackPermissions.add(permission);
        }
    }
    if (!lackPermissions.isEmpty()) {
        return false;
    }
    return true;
}

/**
 * 檢查系統權限是否被授權,如果沒有授權,則執行請求授權的操作
 *
 * @return 權限檢查通過返回true,不通過返回false
 */
public static boolean checkPermissions(Activity activity, String... permissions) {
    List<String> lackPermissions = new ArrayList<>();
    for (String permission : permissions) {
        if (ContextCompat.checkSelfPermission(activity, permission) != PackageManager
                .PERMISSION_GRANTED) {
            lackPermissions.add(permission);
        }
    }
    if (!lackPermissions.isEmpty()) {
        requestPermissions(activity, lackPermissions.toArray(new String[lackPermissions.size()
                ]));
        return false;
    } else {
        return true;
    }
}

/**
 * 請求系統權限,兼容低版本
 */
public static void requestPermissions(Activity activity, String... permissions) {
    ActivityCompat.requestPermissions(activity, permissions, PERMISSION_REQUEST_CODE);
}

}

***
#鏈接
***
[百度api](http://wiki.lbsyun.baidu.com/cms/androidsdk/doc/v4_3_1/index.html?qq-pf-to=pcqq.c2c)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,517評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,087評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,521評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,493評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,207評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,603評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,624評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,813評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,364評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,110評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,305評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,874評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,532評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,953評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,209評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,033評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,268評論 2 375

推薦閱讀更多精彩內容