學習了柳峰大哥的例子
之前隻是單一實作了定位功能 和 搜尋周邊POI的功能,是以這樣的程式也隻能是玩具程式Demo
真正意思上的用途,應該是能夠定位我目前裝置的位置,根據位置去搜尋我周邊的POI。
雖然理論上是給了我兩個完整的例子,但是真正實作中,卻發現定位的位置經緯度(或是參數)沒有辦法傳到我搜尋子產品。
是以糾結啊!不過現在知道怎麼回事了。
百度拾取坐标系統:
原帖:
http://www.apkbus.com/forum.php?mod=viewthread&tid=19735
1)布局檔案res/layout/main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="@string/hello" />
- <com.baidu.mapapi.MapView
- android:id="@+id/map_View"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:clickable="true" />
- </LinearLayout>
複制代碼 布局檔案基本上都這麼個格式,這裡可以加入一些其他的功能。
2)繼承了com.baidu.mapapi.MapActivity的Activity類
- package com.search.map;
- import android.location.Location;
- import android.os.Bundle;
- import com.baidu.mapapi.BMapManager;
- import com.baidu.mapapi.GeoPoint;
- import com.baidu.mapapi.LocationListener;
- import com.baidu.mapapi.MKAddrInfo;
- import com.baidu.mapapi.MKDrivingRouteResult;
- import com.baidu.mapapi.MKPoiResult;
- import com.baidu.mapapi.MKSearch;
- import com.baidu.mapapi.MKSearchListener;
- import com.baidu.mapapi.MKTransitRouteResult;
- import com.baidu.mapapi.MKWalkingRouteResult;
- import com.baidu.mapapi.MapActivity;
- import com.baidu.mapapi.MapController;
- import com.baidu.mapapi.MapView;
- import com.baidu.mapapi.MyLocationOverlay;
- import com.baidu.mapapi.PoiOverlay;
- public class PoiSearchActivity extends MapActivity {
- // 定義地圖引擎管理類
- private BMapManager mapManager;// 定義搜尋服務類
- private MKSearch mMKSearch;
- private MapView mapView;
- private MapController mapController;
- LocationListener mLocationListener = null;// onResume時注冊此listener,onPause時需要Remove
- MyLocationOverlay mLocationOverlay = null; // 定位圖層
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- // 初始化MapActivity
- mapManager = new BMapManager(getApplication());
- // init方法的第一個參數需填入申請的APIKey
- mapManager.init("285B415EBAB2A92293E85502150ADA7F03C777C4", null);
- super.initMapActivity(mapManager);
- mapView = (MapView) findViewById(R.id.map_View);
- // 設定地圖模式為交通地圖
- mapView.setTraffic(true);
- // 設定啟用内置的縮放控件
- mapView.setBuiltInZoomControls(true);
- // 設定在縮放動畫過程中也顯示overlay,預設為不繪制
- mapView.setDrawOverlayWhenZooming(true);
- // 添加定位圖層
- mLocationOverlay = new MyLocationOverlay(this, mapView);
- mapView.getOverlays().add(mLocationOverlay);
- // 注冊定位事件
- mLocationListener = new LocationListener() {
- @Override
- public void onLocationChanged(Location location) {
- if (location != null) {
- GeoPoint geoPoint = new GeoPoint((int) (location.getLatitude() * 1e6),
- (int) (location.getLongitude() * 1e6));
- mapView.getController().animateTo(geoPoint);
- mapController = mapView.getController();
- // 設定地圖的中心
- mapController.setCenter(geoPoint);
- // 設定地圖預設的縮放級别
- mapController.setZoom(16);
- // 初始化
- MKSearch mMKSearch = new MKSearch();
- mMKSearch.init(mapManager, new MySearchListener());
- // 搜尋貴州大學校門口附近500米範圍的自動取款機
- mMKSearch.poiSearchNearBy("ATM", geoPoint, 500);
- }
- }
- };
- }
- @Override
- protected boolean isRouteDisplayed() {
- return false;
- }
- @Override
- protected void onDestroy() {
- if (mapManager != null) {
- // 程式退出前需調用此方法
- mapManager.destroy();
- mapManager = null;
- }
- super.onDestroy();
- }
- @Override
- protected void onPause() {
- if (mapManager != null) {
- // 終止百度地圖API
- mapManager.getLocationManager().removeUpdates(mLocationListener);
- mLocationOverlay.disableMyLocation();
- mLocationOverlay.disableCompass(); // 關閉指南針
- mapManager.stop();
- }
- super.onPause();
- }
- @Override
- protected void onResume() {
- if (mapManager != null) {
- // 開啟百度地圖API
- // 注冊定位事件,定位後将地圖移動到定位點
- mapManager.getLocationManager().requestLocationUpdates(mLocationListener);
- mLocationOverlay.enableMyLocation();
- mLocationOverlay.enableCompass(); // 打開指南針
- mapManager.start();
- }
- super.onResume();
- }
- public class MySearchListener implements MKSearchListener {
- @Override
- public void onGetAddrResult(MKAddrInfo result, int iError) {
- }
- @Override
- public void onGetDrivingRouteResult(MKDrivingRouteResult result, int iError) {
- }
- @Override
- public void onGetPoiResult(MKPoiResult result, int type, int iError) {
- if (result == null) {
- return;
- }
- // PoiOverlay是baidu map api提供的用于顯示POI的Overlay
- PoiOverlay poioverlay = new PoiOverlay(PoiSearchActivity.this, mapView);
- // 設定搜尋到的POI資料
- poioverlay.setData(result.getAllPoi());
- // 在地圖上顯示PoiOverlay(将搜尋到的興趣點标注在地圖上)
- mapView.getOverlays().add(poioverlay);
- }
- @Override
- public void onGetTransitRouteResult(MKTransitRouteResult result, int iError) {
- }
- @Override
- public void onGetWalkingRouteResult(MKWalkingRouteResult result, int iError) {
- }
- }
- }
複制代碼 3)AndroidManifest.xml中的配置
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.search.map"
- android:versionCode="1"
- android:versionName="1.0" >
- <uses-sdk android:minSdkVersion="8" />
- <application
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name" >
- <activity
- android:label="@string/app_name"
- android:name="PoiSearchActivity" >
- <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.INTERNET" />
- <!-- 通路精确位置的權限 -->
- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
- <!-- 通路網絡狀态的權限 -->
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
- <!-- 通路WIFI網絡狀态的權限 -->
- <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
- <!-- 改變WIFI網絡狀态的權限 -->
- <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
- <!-- 讀寫存儲卡的權限 -->
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- <!-- 讀取電話狀态的權限 -->
- <uses-permission android:name="android.permission.READ_PHONE_STATE" />
- </manifest>
複制代碼 在這個過程,要特别注意一點,模拟器是沒有辦法定位,當你加入定位子產品的時候,傳出的參數都是空的。
定位的這個方法函數,是通過回調接口來實作,而且觸發該事件的時候,需要經緯度位置改變。
官方文檔寫得很清楚,簡單點來說,就是你沒有GPS定位裝置就沒有辦法實作(隻能真機測試),GPS定位是實時監控定位,随時都在接收和發射你的位置資訊,隻有不斷的改變才能觸發該定位事件。
(不得不說百度的開發人員很仔細)
2012-1-16 11:53 上傳 下載下傳附件(18.52 KB)
希望有更好的建議,告訴我,共同進步。
Search.zip(1.51 MB, 下載下傳次數: 1303) 2012-1-17 17:10 上傳 點選檔案名下載下傳附件
源代碼
下載下傳積分: 下載下傳豆 -2
其實,對于開發者來說,我覺得Android系統還是用回google提供的東西比較好。
google地圖提供了30多個服務,而且很多服務都是非常簡單就能使用的。
附上,我自己整理一些學習google map place的一些東西。
Google Map Place API的初步使用
http://jeese.blog.163.com/blog/static/200029145201201761713107/
一步步教你用Android Google Map
http://jeese.blog.163.com/blog/static/20002914520122155351455/
如果學會了google的這套map 我相信你會更喜歡使用它,開發起來要比百度地圖友善。
相容Android系統更好。