Android Studio百度地圖開發

本人用Android Studio作百度地圖開發,調試了一成天,始終沒法經過。而後懷疑代碼有問題,就換Eclipse進行代碼編寫,畢竟網上關於Eclipse的資料多一些,出了問題容易解決,後來按照百度的地圖文檔寫的簡單的地圖展現程序還是沒法經過,通過兩個小時的查資料、調試,已經成功解決,要點也已經在上篇文章中寫了出來。今天將Eclipse中的代碼手工移植到android studio中,結果還是沒法運行,提示mBMapMan = new BMapManager(getApplication());這一句異常,緣由是沒法加載baidumapSDk。而後狂查資料,試了不少辦法,終於成功解決,下面說明完整的步驟和代碼。html

1、新建工程java

這個就不詳細說了,起好名字,一路next便可,須要注意的是,工程名字儘可能保持與申請百度key的應用名稱相一致。android

2、加入地圖包編程

一、在與src同級的libs文件夾下放入jar文件(baidumapapi_v2_3_5.jar和locSDK_3.1.jar,一個用於地圖,一個用於定位)。api

以下圖中的藍色橢圓區。而後右鍵libs下的jar文件,選擇"Add as library"。  網絡

二、在main文件夾下新建jniLibs文件夾,niLibs文件夾下新建armeabi文件夾,而後將libBaiduMapSDK_v2_3_5.so和liblocSDK3.so放入該文件夾下。以下圖紅色橢圓部分。注意:該處與eclipse有所不一樣,按照eclipse步驟將armeabi與jar放在同一目錄下,沒法編譯經過。app

 

3、代碼編寫eclipse

一、權限設置等ide

打開AndroidManiFest.xml,此處若看百度地圖文檔,不要複製文檔代碼,複製demo代碼。代碼以下:函數

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.dddd" >

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.android.bjshxian.MainActivity"

//一下兩行加入的代碼
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="sensor"

//加入的代碼結束
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

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

//如下爲權限設置
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />

<permission android:name="android.permission.BAIDU_LOCATION_SERVICE" >
</permission>

<uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
</uses-permission>
<uses-permission android:name="android.permission.INTERNET" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" >
</uses-permission>
<!-- <uses-permission android:name="android.permission.WRITE_APN_SETTINGS"></uses-permission> -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
</uses-permission>
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.WAKE_LOCK" >
</uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_GPS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<!-- SDK1.5須要android.permission.GET_TASKS權限判斷本程序是否爲當前運行的應用? -->
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.CAMERA" >
</uses-permission>
<uses-permission android:name="android.permission.RECORD_AUDIO" >
</uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
</uses-permission>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<!-- 來電消音 -->
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" >
</uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

//權限設置結束

//如下爲屏幕支持設置

<supports-screens
android:anyDensity="true"
android:largeScreens="true"
android:normalScreens="false"
android:resizeable="true"
android:smallScreens="true" />
</manifest>

二、佈局文件

在activity_main.xml中加入以下代碼,此處注意是com.baidu.mapapi.map.MapView,不是android自帶的MapView,也不是com.baidu.mapapi.map.mapview,我曾由於誤將MapView寫成mapview調試了將近半個小時。

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

</com.baidu.mapapi.map.MapView>

三、MainActivity.java,增長相關引用

//如下爲baidu地圖類

import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.MKGeneralListener;
import com.baidu.mapapi.map.MKEvent;
import com.baidu.mapapi.map.MKMapViewListener;
import com.baidu.mapapi.map.MapController;
import com.baidu.mapapi.map.MapView;
import com.baidu.platform.comapi.basestruct.GeoPoint;

//如下爲用到的android類

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.widget.Toast;

//聲明變量:

private static final String strKey = "XSKUnDZQHrKDuteH234cR3Zt";//此處是百度key,記得換成本身的key
private Toast mToast;
//百度地圖的三個重要元素
private BMapManager mBMapMan = null;
private MapView mMapView = null;
private MapController mMapCon = null;

//MKMapViewListener 用於處理地圖事件回調
private MKMapViewListener mMapListener = null;

 

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//建立MapManager必定要在 setcontentView以前
mBMapMan = new BMapManager(getApplication());
mBMapMan.init(strKey, new MyGeneralListener());

setContentView(R.layout.activity_main);

mMapView = (MapView) findViewById(R.id.bmapView);
initMap();
double cLat = 32.044382;
double cLon = 118.828688;
moveToPoint(cLat, cLon);
}

/**
* 將地圖移到指定位置,此函數只是顯示的中心位置,並不是精確到某個定位點
*/
private void moveToPoint(double cLat ,double cLon){
/**
* 將地圖移動至指定點
* 使用百度經緯度座標,能夠經過http://api.map.baidu.com/lbsapi/getpoint/index.html查詢地理座標
* 若是須要在百度地圖上顯示使用其餘座標系統的位置,請發郵件至mapapi@baidu.com申請座標轉換接口
*/

GeoPoint p = new GeoPoint((int)(cLat * 1E6),(int)(cLon * 1E6));
mMapCon.setCenter(p);
}

/**
* 在佈局文件被載入以後,初始化地圖
*/
private void initMap(){
//根據mapView獲取 mapController,這些都是地圖編程必須的
mMapCon = mMapView.getController();

mMapCon.enableClick(true); //設置地圖響應點擊事件
mMapCon.setZoom(12); //設置地圖縮放級別爲12
//顯示內置的縮放控件
mMapView.setBuiltInZoomControls(true);
}

// 經常使用事件監聽,用來處理一般的網絡錯誤,受權驗證錯誤等
class MyGeneralListener implements MKGeneralListener {

@Override
public void onGetNetworkState(int iError) {
if (iError == MKEvent.ERROR_NETWORK_CONNECT) {
showToast("網絡錯誤");
}
else if (iError == MKEvent.ERROR_NETWORK_DATA) {
showToast("請輸入正確的檢索條件");
}
// ...
}

@Override
public void onGetPermissionState(int iError) {
//非零值表示key驗證未經過
if (iError != 0) {
//受權Key錯誤:
showToast("受權Key錯誤");
}
else{
showToast("key認證成功");
}
}
}

//顯示toast
public void showToast(String msg) {
if (mToast == null) {
mToast = Toast.makeText(this, msg, Toast.LENGTH_SHORT);
} else {
mToast.setText(msg);
mToast.setDuration(Toast.LENGTH_SHORT);
}
mToast.show();
}

大功告成,編譯便可。

另外補充一點,申請key時須要用到SHA1,android studio中沒找到,我是從Eclipse中找的。若哪位朋友知道as中怎樣找,還望告知。

相關文章
相關標籤/搜索