剛學完Android,決定來個小小應用。做什麽呢?之前在公司看人家用iOS做的地圖不錯,幹脆我就做個android版吧。
百度了壹下它的api,很簡單。花了半天解決。首先新建壹個工程,然後把baidumapapi.jar拷貝到工程下的lib文件夾裏,同時在裏面建壹個文件夾armeabi,再把libBMapApiEngine_v1_3_3.so動態庫文件拷進去,打開eclipse,右鍵點擊工程的Properties,進入Java?Build Path,打開Libraries,點擊Add External JARS,把baidumapapi.jar添加進去,ok,配置好了。
自定義壹個Aplication類,WhereMapApplication,繼承自Application(拷貝自官方百度):
[cpp]?view?plain?copy?print?public?class?WhereMapApplication?extends?Application?{?
static?WhereMapApplication?mDemoApp;?
//百度MapAPI的管理類?
BMapManager?mBMapMan?=?null;?
//?授權Key?
//?TODO:?請輸入您的Key,?
//?申請地址:/wiki/static/imap/key/?
String?mStrKey?=?"申請的KEY值";?
boolean?m_bKeyRight?=?true;?//?授權Key正確,驗證通過?
//?常用事件監聽,用來處理通常的網絡錯誤,授權驗證錯誤等?
static?class?MyGeneralListener?implements?MKGeneralListener?{?
@Override?
public?void?onGetNetworkState(int?iError)?{?
Log.d("MyGeneralListener",?"onGetNetworkState?error?is?"+?iError);?
Toast.makeText(WhereMapApplication.mDemoApp.getApplicationContext(),?"您的網絡出錯啦!",?
Toast.LENGTH_LONG).show();?
}?
@Override?
public?void?onGetPermissionState(int?iError)?{?
Log.d("MyGeneralListener",?"onGetPermissionState?error?is?"+?iError);?
if?(iError?==?MKEvent.ERROR_PERMISSION_DENIED)?{?
//?授權Key錯誤:?
Toast.makeText(WhereMapApplication.mDemoApp.getApplicationContext(),
"請在BMapApiDemoApp.java文件輸入正確的授權Key!",?
Toast.LENGTH_LONG).show();?
WhereMapApplication.mDemoApp.m_bKeyRight?=?false;?
}?
}?
}?
@Override?
public?void?onCreate()?{?
Log.v("BMapApiDemoApp",?"onCreate");?
mDemoApp?=?this;?
mBMapMan?=?new?BMapManager(this);?
mBMapMan.init(this.mStrKey,?new?MyGeneralListener());?
mBMapMan.getLocationManager().setNotifyInternal(10,?5);?
//?if?(mBMapMan?!=?null)?{?
//?mBMapMan.destroy();?
//?mBMapMan?=?null;?
//?}?
super.onCreate();?
}?
@Override?
//建議在您app的退出之前調用mapadpi的destroy()函數,避免重復初始化帶來的時間消耗?
public?void?onTerminate()?{?
//?TODO?Auto-generated?method?stub?
if?(mBMapMan?!=?null)?{?
mBMapMan.destroy();?
mBMapMan?=?null;?
}?
super.onTerminate();
百度API地址:/wiki/static/index.htm
百度申請key地址:/wiki/static/imap/key/
註冊百度用戶,再申請key值,把key值替換以上代碼中的"申請的KEY值"。
修改AndroidManifest.xml文件中application的屬性,添加android:name=".WhereMapApplication"如下:
[html]?view?plain?copy?print?<application?
android:name=".WhereMapApplication"?
android:icon="@drawable/ic_launcher"?
android:label="@string/app_name"?>
並且在之前添加,如果加在最後有可能會有警告產生:
[html]?view?plain?copy?print?<uses-sdk?
android:minSdkVersion="3"?/>?
<uses-permission?android:name="android.permission.ACCESS_NETWORK_STATE"?>?
</uses-permission>?
<uses-permission?android:name="android.permission.ACCESS_FINE_LOCATION"?>?
</uses-permission>?
<uses-permission?android:name="android.permission.INTERNET"?>?
</uses-permission>?
<uses-permission?android:name="android.permission.WRITE_EXTERNAL_STORAGE"?>?
</uses-permission>?
<uses-permission?android:name="android.permission.ACCESS_WIFI_STATE"?>?
</uses-permission>?
<uses-permission?android:name="android.permission.CHANGE_WIFI_STATE"?>?
</uses-permission>?
<uses-permission?android:name="android.permission.READ_PHONE_STATE"?>?
</uses-permission>?
<supports-screens?
android:anyDensity="true"?
android:largeScreens="true"?
android:normalScreens="true"?
android:resizeable="true"?
android:smallScreens="true"?/>
如果想使用在activity裏面,就需要新建壹個自定義的activity繼承自MapActivity。我創建了壹個MainActivity,如下:
[html]?view?plain?copy?print?public?class?MainActivity?extends?MapActivity?{?
@Override?
public?void?onCreate(Bundle?savedInstanceState)?{?
super.onCreate(savedInstanceState);?
setContentView(R.layout.activity_main);?
WhereMapApplication?app?=?(WhereMapApplication)this.getApplication();?
if?(app.mBMapMan?==?null)?{?
app.mBMapMan?=?new?BMapManager(getApplication());?
app.mBMapMan.init(app.mStrKey,?new?WhereMapApplication.MyGeneralListener());?
}?
app.mBMapMan.start();?
//?如果使用地圖SDK,請初始化地圖Activity?
//?long?iTime?=?System.nanoTime();?
super.initMapActivity(app.mBMapMan);?
//iTime?=?System.nanoTime()?-?iTime;?
//Log.d("MapViewDemo",?"the?init?time?is?"?+?iTime);?
MapView?mapView?=?(MapView)findViewById(R.id.bmapView);?
mapView.setBuiltInZoomControls(true);?
}?
@Override?
public?boolean?onCreateOptionsMenu(Menu?menu)?{?
getMenuInflater().inflate(R.menu.activity_main,?menu);?
return?true;?
}?
@Override?
protected?boolean?isRouteDisplayed()?{?
//?TODO?Auto-generated?method?stub?
return?false;?
}?
@Override?
protected?void?onPause()?{?
WhereMapApplication?app?=?(WhereMapApplication)this.getApplication();?
if(app.mBMapMan?!=?null?)?
app.mBMapMan.stop();?
super.onPause();?
}?
@Override?
protected?void?onResume()?{?
WhereMapApplication?app?=?(WhereMapApplication)this.getApplication();?
app.mBMapMan.start();?
super.onResume();?
}?
}
BMapManager在application中new之後,使用init初始化之後,在需要的activity裏面使用start,stop就可以控制map的顯示和關閉:
[java]?view?plain?copy?print?public?class?MainActivity?extends?MapActivity?{?
@Override?
public?void?onCreate(Bundle?savedInstanceState)?{?
super.onCreate(savedInstanceState);?
setContentView(R.layout.activity_main);?
WhereMapApplication?app?=?(WhereMapApplication)this.getApplication();?
if?(app.mBMapMan?==?null)?{?
app.mBMapMan?=?new?BMapManager(getApplication());?
app.mBMapMan.init(app.mStrKey,?new?WhereMapApplication.MyGeneralListener());?
}?
app.mBMapMan.start();?
//?如果使用地圖SDK,請初始化地圖Activity?
//?long?iTime?=?System.nanoTime();?
super.initMapActivity(app.mBMapMan);?
//iTime?=?System.nanoTime()?-?iTime;?
//Log.d("MapViewDemo",?"the?init?time?is?"?+?iTime);?
MapView?mapView?=?(MapView)findViewById(R.id.bmapView);?
mapView.setBuiltInZoomControls(true);?
}?
@Override?
public?boolean?onCreateOptionsMenu(Menu?menu)?{?
getMenuInflater().inflate(R.menu.activity_main,?menu);?
return?true;?
}?
@Override?
protected?boolean?isRouteDisplayed()?{?
//?TODO?Auto-generated?method?stub?
return?false;?
}?
@Override?
protected?void?onPause()?{?
WhereMapApplication?app?=?(WhereMapApplication)this.getApplication();?
if(app.mBMapMan?!=?null?)?
app.mBMapMan.stop();?
super.onPause();?
}?
@Override?
protected?void?onResume()?{?
WhereMapApplication?app?=?(WhereMapApplication)this.getApplication();?
app.mBMapMan.start();?
super.onResume();?
}?
}
這個時候已經能顯示出地圖了,不過是在模擬器上測試的,沒有真機,只能先寫在這裏了。其余如打點,搜索等功能在官方代碼中均有詳細說明,就不壹壹描述了。