package com.roboo.like.google; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Random; import android.app.Activity; import android.app.AlertDialog; import android.app.SearchManager; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.database.Cursor; import android.database.MatrixCursor; import android.graphics.Bitmap; import android.graphics.Color; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.provider.BaseColumns; import android.text.TextUtils; import android.util.TypedValue; import android.view.Gravity; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.view.ViewGroup; import android.widget.Button; import android.widget.CursorAdapter; import android.widget.ImageView; import android.widget.SearchView; import android.widget.SearchView.OnCloseListener; import android.widget.SearchView.OnQueryTextListener; import android.widget.SearchView.OnSuggestionListener; import android.widget.TextView; import android.widget.Toast; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.baidu.mapapi.BMapManager; import com.baidu.mapapi.map.LocationData; import com.baidu.mapapi.map.MKEvent; import com.baidu.mapapi.map.MKMapViewListener; import com.baidu.mapapi.map.MapController; import com.baidu.mapapi.map.MapPoi; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.MyLocationOverlay; import com.baidu.mapapi.map.PoiOverlay; import com.baidu.mapapi.map.PopupClickListener; import com.baidu.mapapi.map.PopupOverlay; import com.baidu.mapapi.map.RouteOverlay; import com.baidu.mapapi.search.MKAddrInfo; import com.baidu.mapapi.search.MKBusLineResult; import com.baidu.mapapi.search.MKDrivingRouteResult; import com.baidu.mapapi.search.MKPlanNode; import com.baidu.mapapi.search.MKPoiInfo; import com.baidu.mapapi.search.MKPoiResult; import com.baidu.mapapi.search.MKRoute; import com.baidu.mapapi.search.MKRouteAddrResult; import com.baidu.mapapi.search.MKSearch; import com.baidu.mapapi.search.MKSearchListener; import com.baidu.mapapi.search.MKShareUrlResult; import com.baidu.mapapi.search.MKSuggestionInfo; import com.baidu.mapapi.search.MKSuggestionResult; import com.baidu.mapapi.search.MKTransitRouteResult; import com.baidu.mapapi.search.MKWalkingRouteResult; import com.baidu.platform.comapi.basestruct.GeoPoint; import com.roboo.like.google.utils.CardToastUtils; /** 我的位置 */ public class LocationActivity extends BaseLayoutActivity { /** 在显示定位结果时等待时间 */ private static final long DELAY_IN_MILLIS_SHOW_LOCATION_RESULT = 500L; private static final int LOCATION_BY_GPS_CODE = 61;// BDLocation.TypeGpsLocation private static final int LOCATION_BY_NETWORK_CODE = 161;// BDLocation.TypeNetWorkLocation private static final double LOCATION_FAILURED_LONGITUDE_LATITUDE = 4.9E-324; private static final String[] COLUMNS = { BaseColumns._ID, SearchManager.SUGGEST_COLUMN_TEXT_1, }; public LocationClient mLocationClient = null; private MapView mMapView; /** 百度地图管理器,需要在setContentView之前init */ private BMapManager mBMapManager = null; // /** 定位成功后获取的经度 */ // private double mLocationLongitude; // /** 定位成功后获取的纬度 */ // private double mLocationLatitude; private Button mBtnDetail; private boolean mPopupShowingFlag = false; private LocationData mLocationData = new LocationData(); private TextView mPopupTextView; private PopupOverlay mPopupOverlay; private GeoPoint mStartGeoPoint; private GeoPoint mEndGeoPoint; private MapController mMapController; /** 线路图层 */ private RouteOverlay mRouteOverlay; /** 我的位置图层 */ private LocationOverlay mLocationOverlay; /** 点击位置图层 */ private LocationOverlay mClickLocationOverlay; /** 目的地信息 */ private MKPoiInfo mMKInfo; private MKSearch mMKSearch; // 将路线数据保存给全局变量 private MKRoute mDividerRoute; private MKRoute mWalkRoute; private SearchView mSearchView; private SuggestionsAdapter mSuggestAdapter = null; private MatrixCursor mCursorData; private boolean mSelfRoute = false; private Handler mHandler = new Handler() { public void handleMessage(Message msg) { if (null == mBMapManager) { return; } new CardToastUtils(LocationActivity.this).setMessageTextColor(Color.RED).showAndAutoDismiss("定位成功 " + msg.obj); mStartGeoPoint = new GeoPoint((int) (mLocationData.latitude * 1E6), (int) (mLocationData.longitude * 1E6)); // 用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6) mMapController.setCenter(mStartGeoPoint);// 设置地图中心点 mMapController.animateTo(mStartGeoPoint); mMapController.setZoom(19); mLocationOverlay.setData(mLocationData);// 设置我的位置信息 // 更新图层数据执行刷新后生效 mMapView.refresh(); mLocationClient.stop(); }; }; /** 跳转到我的位置界面 */ public static void actionLocation(Activity activity) { Intent intent = new Intent(activity, LocationActivity.class); activity.startActivity(intent); } protected void onCreate(Bundle savedInstanceState) { GoogleApplication app = (GoogleApplication) this.getApplication(); if (app.mBMapManager == null) { app.mBMapManager = new BMapManager(getApplicationContext()); app.mBMapManager.init(new GoogleApplication.MyGeneralListener()); } mBMapManager = app.mBMapManager; mLocationClient = new LocationClient(getApplicationContext()); mLocationClient.registerLocationListener(new BDLocationListenerImpl()); // 默认经纬度为苏州 mLocationData.latitude = SUZHOU_LATITUDE; mLocationData.longitude = SUZHOU_LONGITUDE; mStartGeoPoint = new GeoPoint((int) (mLocationData.latitude * 1E6), (int) (mLocationData.longitude * 1E6)); super.onCreate(savedInstanceState); customActionBar(); setContentView(R.layout.activity_location);// TODO initView(); initMapView(); initLocationClient(); initMKSearch(); startRequestLocation(); setListener(); mMapController.animateTo(mStartGeoPoint); } private void setListener() { mBtnDetail.setOnClickListener(new OnClickListenerImpl()); } private void initMKSearch() { mMKSearch = new MKSearch(); mMKSearch.init(mBMapManager, new MKSearchListenerImpl()); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_location, menu); MenuItem searchItem = menu.findItem(R.id.menu_search); mSearchView = (SearchView) searchItem.getActionView(); mSearchView.setQueryHint("输入关键字"); mSearchView.setSubmitButtonEnabled(true);// 显示搜索提交按钮 modifySearchView(); SearchViewListenerImpl searchViewListenerImpl = new SearchViewListenerImpl(); mSearchView.setOnQueryTextListener(searchViewListenerImpl); mSearchView.setOnCloseListener(searchViewListenerImpl); mSearchView.setOnSuggestionListener(searchViewListenerImpl); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { String searchKey = "美食"; switch (item.getItemId()) { case android.R.id.home: finish(); return true; case R.id.menu_search:// 搜索 return true; case R.id.menu_location: Toast.makeText(this, "定位", Toast.LENGTH_SHORT).show(); startRequestLocation(); return true; // return true; case R.id.menu_food:// 美食 case R.id.menu_hotel:// 酒店 case R.id.menu_market:// 超市 case R.id.menu_cinema:// 影院 searchKey = item.getTitle().toString(); String city = mPreferences.getString(PREF_LOACTION_CITY, DEFAULT_CITY); mMKSearch.poiSearchInCity(city, searchKey); return true; } return super.onOptionsItemSelected(item); } /** 请求定位 */ private void startRequestLocation() { mLocationClient.start(); mLocationClient.requestLocation(); } private void initLocationClient() { LocationClientOption option = new LocationClientOption(); option.setOpenGps(true); option.setAddrType("all");// 返回的定位结果包含地址信息 option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02 // option.setScanSpan(5000);// 设置发起定位请求的间隔时间为5000ms option.setPoiNumber(5); // 最多返回POI个数 option.setPoiDistance(1000); // poi查询距离 option.setPoiExtraInfo(true); // 是否需要POI的电话和地址等详细信息 mLocationClient.setLocOption(option); } @Override protected void onResume() { super.onResume(); mMapView.onResume(); if (null != mBMapManager) { mBMapManager.start(); } } protected void onPause() { super.onPause(); mMapView.onPause(); if (mBMapManager != null) { mBMapManager.stop(); } } protected void onDestroy() { super.onDestroy(); mMapView.destroy(); if (mBMapManager != null) { mBMapManager.destroy(); mBMapManager = null; GoogleApplication app = (GoogleApplication) this.getApplication(); app.mBMapManager = null; } } public void initView() { mBtnDetail = (Button) findViewById(R.id.btn_detail); mMapView = (MapView) findViewById(R.id.mv_mapview); mMapView.setOnTouchListener(getOnTouchListener()); mPopupTextView = new TextView(this); mPopupTextView.setTextColor(Color.RED); mPopupTextView.setPadding(50, 50, 50, 50); mPopupTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16.f); mPopupTextView.setGravity(Gravity.CENTER); mPopupOverlay = new PopupOverlay(mMapView, new PopupClickListenerImpl()); } private void initMapView() { mMapView.setBuiltInZoomControls(true); // 设置启用内置的缩放控件 mMapController = mMapView.getController(); mMapController.enableClick(true);// 设置可点击 mMapController.setZoom(19);// 设置地图zoom级别最高级别 mMapController.enableClick(true); mLocationOverlay = new LocationOverlay(mMapView);// 创建定位图层 mClickLocationOverlay = new LocationOverlay(mMapView);// 创建用户点击位置图层 mLocationOverlay.enableCompass(); // 打开指南针 mLocationOverlay.setData(mLocationData);// 设置我的位置信息 mMapView.getOverlays().add(mLocationOverlay);// 添加定位图层 mMapView.setTraffic(true); mMapView.setBuiltInZoomControls(false); mMapView.showScaleControl(true); // 修改定位数据后刷新图层生效 mMapView.refresh(); mMapView.regMapViewListener(mBMapManager, new MKMapViewListenerImpl()); } private void customActionBar() { mActionBar.setDisplayHomeAsUpEnabled(true); mActionBar.setTitle("我的位置"); mActionBar.setLogo(R.drawable.ic_abs_location_up); } /** TODO 规划线路 */ public void routeDrive(MKPoiInfo info) { routeDrive(info, false); } public void routeWalk(MKPoiInfo info) { mMKInfo = info; mEndGeoPoint = mMKInfo.pt; String city = mPreferences.getString(PREF_LOACTION_CITY, DEFAULT_CITY); String address = mPreferences.getString(PREF_LOACTION_ADDRESS, DEFAULT_ADDRESS); if (null != mRouteOverlay) { // 移除上次规划的线路 mMapView.getOverlays().remove(mRouteOverlay); } // 对起点终点的name进行赋值,也可以直接对坐标赋值,赋值坐标则将根据坐标进行搜索 MKPlanNode startNode = new MKPlanNode(); startNode.pt = mStartGeoPoint; startNode.name = address; MKPlanNode endNode = new MKPlanNode(); endNode.name = mMKInfo.address; endNode.pt = mMKInfo.pt; mMKSearch.walkingSearch(city, startNode, city, endNode); } /** TODO 规划线路 */ public void routeDrive(MKPoiInfo info, boolean selfRoute) { mMKInfo = info; mSelfRoute = selfRoute; mEndGeoPoint = mMKInfo.pt; String city = mPreferences.getString(PREF_LOACTION_CITY, DEFAULT_CITY); String address = mPreferences.getString(PREF_LOACTION_ADDRESS, DEFAULT_ADDRESS); if (null != mRouteOverlay) { // 移除上次规划的线路 mMapView.getOverlays().remove(mRouteOverlay); } // 对起点终点的name进行赋值,也可以直接对坐标赋值,赋值坐标则将根据坐标进行搜索 MKPlanNode startNode = new MKPlanNode(); startNode.pt = mStartGeoPoint; startNode.name = address; MKPlanNode endNode = new MKPlanNode(); endNode.name = mMKInfo.address; endNode.pt = mMKInfo.pt; mMKSearch.drivingSearch(city, startNode, city, endNode); } /** TODO 修改SearchView属性 */ private void modifySearchView() { try { Field field = SearchView.class.getDeclaredField("mSubmitButton"); field.setAccessible(true); Object object = field.get(mSearchView); if (object instanceof ImageView) { ImageView tmpImageView = (ImageView) object; tmpImageView.setImageResource(R.drawable.ic_menu_search); field.set(object, tmpImageView); } field = SearchView.class.getDeclaredField("mSearchButton"); field.setAccessible(true); object = field.get(mSearchView); if (object instanceof ImageView) { ImageView tmpImageView = (ImageView) object; tmpImageView.setImageResource(R.drawable.ic_menu_search); field.set(object, tmpImageView); } } catch (Exception e) { e.printStackTrace(); } } private class BDLocationListenerImpl implements BDLocationListener { public void onReceiveLocation(BDLocation location) { if (null != location) { StringBuffer stringBuffer = new StringBuffer(256); String locationTime = location.getTime();// 定位时间 int statusCode = location.getLocType();// 定位方式[61:GPS 161:NETWORK] double longitude = location.getLongitude();// 经度 double latitude = location.getLatitude();// 纬度 float radius = location.getRadius();// 精度半径 String address = location.getAddrStr();// 网络定位时才有数据,地址信息 String city = location.getCity(); float speed = location.getSpeed();// GPS定位时才有数据 int satellite = location.getSatelliteNumber();// GPS定位时才有数据 if (longitude == LOCATION_FAILURED_LONGITUDE_LATITUDE) { longitude = SUZHOU_LONGITUDE; latitude = SUZHOU_LATITUDE; } mLocationData.longitude = longitude; mLocationData.latitude = latitude; mLocationData.satellitesNum = satellite; mLocationData.speed = speed; stringBuffer.append("\nlocationTime[定位时间] = " + locationTime); stringBuffer.append("\nstatusCode[定位方式[61:GPS 161:NETWORK]] = " + statusCode); stringBuffer.append("\nlongitude[经度] = " + longitude); stringBuffer.append("\nlatitude[纬度] = " + latitude); stringBuffer.append("\nradius[精度半径] = " + radius); if (location.getLocType() == LOCATION_BY_GPS_CODE) { stringBuffer.append("\nspeed = " + speed); stringBuffer.append("\nsatellite = " + satellite); } else if (location.getLocType() == LOCATION_BY_NETWORK_CODE) { stringBuffer.append("\naddress[地址信息] = " + address); } System.out.println("定位结果 = " + stringBuffer.toString()); if (!TextUtils.isEmpty(address)) { Message message = mHandler.obtainMessage(); message.obj = address; mHandler.sendMessageDelayed(message, DELAY_IN_MILLIS_SHOW_LOCATION_RESULT); mPreferences.edit().putString(PREF_LOACTION_ADDRESS, address).commit(); } if (!TextUtils.isEmpty(city)) { mPreferences.edit().putString(PREF_LOACTION_CITY, city).commit(); } } } @Override public void onReceivePoi(BDLocation location) { } } private class PopupClickListenerImpl implements PopupClickListener { public void onClickedPopup(int arg0) { } } private class LocationOverlay extends MyLocationOverlay { public LocationOverlay(MapView mapView) { super(mapView); setMarker(getResources().getDrawable(R.drawable.ic_geo)); // 修改图层,需要刷新MapView生效 mapView.refresh(); } protected boolean dispatchTap() { // 处理点击事件,弹出泡泡 if (null != mPopupTextView) { mPopupTextView.setBackgroundResource(R.drawable.ic_popup); mPopupTextView.setText("我的位置"); mPopupShowingFlag = true; mPopupOverlay.showPopup(getBitmapFromView(mPopupTextView), new GeoPoint((int) (mLocationData.latitude * 1e6), (int) (mLocationData.longitude * 1e6)), 8); } return true; } public Bitmap getBitmapFromView(View view) { view.destroyDrawingCache(); view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); view.setDrawingCacheEnabled(true); Bitmap bitmap = view.getDrawingCache(true); return bitmap; } } private OnTouchListener getOnTouchListener() { return new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { // 消隐泡泡 if (mPopupOverlay != null && mPopupShowingFlag && event.getAction() == MotionEvent.ACTION_UP) { mPopupOverlay.hidePop(); mPopupShowingFlag = false; return true; } return false; } }; } public GeoPoint[][] dummyData() { int count = 6; int startLa = mStartGeoPoint.getLatitudeE6(); int startLo = mStartGeoPoint.getLongitudeE6(); int endLa = mEndGeoPoint.getLatitudeE6(); int endLo = mEndGeoPoint.getLongitudeE6(); int perDifferLa = (endLa - startLa) / count; int perDifferLo = (endLo - startLo) / count; GeoPoint[] step = new GeoPoint[count + 2]; Random random = new Random(); step[0] = mStartGeoPoint; for (int i = 0; i < count; i++) { int dummyNextInt = random.nextInt(count); System.out.println("dummyNextInt = " + dummyNextInt); GeoPoint point = new GeoPoint(startLa + perDifferLa * dummyNextInt, startLo + perDifferLo * dummyNextInt); step[i + 1] = point; } step[count + 1] = mEndGeoPoint; // 站点数据保存在一个二维数据中 GeoPoint[][] routeData = new GeoPoint[1][]; routeData[0] = step; return routeData; } /** TODO 百度搜索 处理回调事件 */ class MKSearchListenerImpl implements MKSearchListener { public void onGetAddrResult(MKAddrInfo arg0, int arg1) {} @Override public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) { } @Override public void onGetDrivingRouteResult(MKDrivingRouteResult res, int error) { // 起点或终点有歧义,需要选择具体的城市列表或地址列表 if (error == MKEvent.ERROR_ROUTE_ADDR) { return; } // 错误号可参考MKEvent中的定义 if (error != 0 || res == null) { Toast.makeText(LocationActivity.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show(); return; } // 将路线数据保存给全局变量 mDividerRoute = res.getPlan(0).getRoute(0); getRouteInfo(res); mRouteOverlay = new RouteOverlay(LocationActivity.this, mMapView); if (mSelfRoute) { mDividerRoute.customizeRoute(mStartGeoPoint, mEndGeoPoint, dummyData()); } // 此处仅展示一个方案作为示例 mRouteOverlay.setData(mDividerRoute); // 清除其他图层 // mMapView.getOverlays().clear(); // 添加定位地点图层 // mMapView.getOverlays().add(mLocationOverlay); // 添加路线图层 mMapView.getOverlays().add(mRouteOverlay); // 执行刷新使生效 mMapView.refresh(); // 使用zoomToSpan()绽放地图,使路线能完全显示在地图上 mMapView.getController().zoomToSpan(mRouteOverlay.getLatSpanE6(), mRouteOverlay.getLonSpanE6()); // 移动地图到起点 mMapView.getController().animateTo(res.getStart().pt); // 重置路线节点索引,节点浏览时使用 } @Override public void onGetPoiDetailSearchResult(int arg0, int arg1) { } @Override public void onGetPoiResult(MKPoiResult res, int type, int error) { // 错误号可参考MKEvent中的定义 if (error != 0 || res == null) { Toast.makeText(LocationActivity.this, "抱歉,未找到结果", Toast.LENGTH_LONG).show(); return; } // 将地图移动到第一个POI中心点 if (res.getCurrentNumPois() > 0) { // 将poi结果显示到地图上 MyPoiOverlay poiOverlay = new MyPoiOverlay(LocationActivity.this, mMapView, mMKSearch); poiOverlay.setData(res.getAllPoi()); mMapView.getOverlays().clear(); mMapView.getOverlays().add(mLocationOverlay); mMapView.getOverlays().add(poiOverlay); mMapView.refresh(); // 当ePoiType为2(公交线路)或4(地铁线路)时, poi坐标为空 for (MKPoiInfo info : res.getAllPoi()) { if (info.pt != null) { mMapView.getController().animateTo(info.pt); break; } } } else if (res.getCityListNum() > 0) { // 当输入关键字在本市没有找到,但在其他城市找到时,返回包含该关键字信息的城市列表 String strInfo = "在"; for (int i = 0; i < res.getCityListNum(); i++) { strInfo += res.getCityListInfo(i).city; strInfo += ","; } strInfo += "找到结果"; Toast.makeText(LocationActivity.this, strInfo, Toast.LENGTH_LONG).show(); } } @Override public void onGetShareUrlResult(MKShareUrlResult arg0, int arg1, int arg2) { } @Override public void onGetSuggestionResult(MKSuggestionResult res, int arg1) { if (res == null || res.getAllSuggestions() == null) { return; } mCursorData = new MatrixCursor(COLUMNS); for (int i = 0; i < res.getAllSuggestions().size(); i++) { MKSuggestionInfo info = res.getAllSuggestions().get(i); if (info.key != null) { System.out.println("key = " + info.key); if (i > 5) continue; mCursorData.addRow(new String[] { (1 + i) + "", info.key }); } } mSuggestAdapter = new SuggestionsAdapter(LocationActivity.this, mCursorData); mSearchView.setSuggestionsAdapter(mSuggestAdapter); mSuggestAdapter.notifyDataSetChanged(); } @Override public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) { } @Override public void onGetWalkingRouteResult(MKWalkingRouteResult res, int error) { // 起点或终点有歧义,需要选择具体的城市列表或地址列表 if (error == MKEvent.ERROR_ROUTE_ADDR) { return; } // 错误号可参考MKEvent中的定义 if (error != 0 || res == null) { Toast.makeText(LocationActivity.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show(); return; } // 将路线数据保存给全局变量 mWalkRoute = res.getPlan(0).getRoute(0); getWalkInfo(res); mRouteOverlay = new RouteOverlay(LocationActivity.this, mMapView); if (mSelfRoute) { mWalkRoute.customizeRoute(mStartGeoPoint, mEndGeoPoint, dummyData()); } // 此处仅展示一个方案作为示例 mRouteOverlay.setData(mWalkRoute); // 清除其他图层 // mMapView.getOverlays().clear(); // 添加定位地点图层 // mMapView.getOverlays().add(mLocationOverlay); // 添加路线图层 mMapView.getOverlays().add(mRouteOverlay); // 执行刷新使生效 mMapView.refresh(); // 使用zoomToSpan()绽放地图,使路线能完全显示在地图上 mMapView.getController().zoomToSpan(mRouteOverlay.getLatSpanE6(), mRouteOverlay.getLonSpanE6()); // 移动地图到起点 mMapView.getController().animateTo(res.getStart().pt); // 重置路线节点索引,节点浏览时使用 } } class MyPoiOverlay extends PoiOverlay { MKSearch mSearch; private LocationActivity mActivity; public MyPoiOverlay(LocationActivity activity, MapView mapView, MKSearch search) { super(activity, mapView); mSearch = search; mActivity = activity; } @Override protected boolean onTap(int i) { super.onTap(i); MKPoiInfo info = getPoi(i); StringBuffer message = new StringBuffer(); message.append("城市:" + info.city); message.append("\n名称:" + info.name); message.append("\n地址:" + info.address); message.append("\n电话号码:" + info.phoneNum); final AlertDialog alertDialog = new AlertDialog.Builder(mActivity).setMessage(message).setTitle("位置详情").setPositiveButton("驾车线路", getOnClickListener(info)).setNegativeButton("取消", null).setNeutralButton("步行路线", getOnClickListener(info)).create(); alertDialog.show(); return true; } private OnClickListener getOnClickListener(final MKPoiInfo info) { return new OnClickListener() { public void onClick(DialogInterface dialog, int which) { switch (which) { case DialogInterface.BUTTON_POSITIVE: routeDrive(info); break; case DialogInterface.BUTTON_NEUTRAL: routeWalk(info); break; case DialogInterface.BUTTON_NEGATIVE: dialog.dismiss(); break; } } }; } } private class MKMapViewListenerImpl implements MKMapViewListener { public void onClickMapPoi(MapPoi poi) { if (null != poi) { mEndGeoPoint = new GeoPoint(poi.geoPt.getLatitudeE6(), poi.geoPt.getLongitudeE6()); LocationData clickLocationData = new LocationData(); clickLocationData.latitude = poi.geoPt.getLatitudeE6() / 1000000.0; clickLocationData.longitude = poi.geoPt.getLongitudeE6() / 1000000.0; mClickLocationOverlay.setData(clickLocationData); mClickLocationOverlay.setMarker(getResources().getDrawable(R.drawable.ic_nav_turn_start_s)); mMapView.getOverlays().remove(mClickLocationOverlay); // mMapView.getOverlays().add(mClickLocationOverlay); MKPoiInfo info = new MKPoiInfo(); info.pt = poi.geoPt; info.address = poi.strText; routeDrive(info, true); mMapView.refresh(); Toast.makeText(LocationActivity.this, poi.strText, Toast.LENGTH_SHORT).show(); } } @Override public void onGetCurrentMap(Bitmap arg0) { } @Override public void onMapAnimationFinish() { } @Override public void onMapLoadFinish() { } @Override public void onMapMoveFinish() { } } private class OnClickListenerImpl implements android.view.View.OnClickListener { public void onClick(View v) { switch (v.getId()) { case R.id.btn_detail: if (null != mDividerRoute) { String startAddress = mPreferences.getString(PREF_LOACTION_ADDRESS, DEFAULT_ADDRESS); String endAddress = mMKInfo.address; ArrayList<String> routeList = new ArrayList<String>(); routeList.add(startAddress); int steps = mDividerRoute.getNumSteps(); for (int i = 0; i < steps; i++) { routeList.add(mDividerRoute.getStep(i).getContent()); System.out.println(mDividerRoute.getStep(i).getContent()); } routeList.add(endAddress); RouteActivity.actionRoute(LocationActivity.this, routeList, RouteActivity.TYPE_DIVIDER); mDividerRoute = null; } else if (null != mWalkRoute) { String startAddress = mPreferences.getString(PREF_LOACTION_ADDRESS, DEFAULT_ADDRESS); String endAddress = mMKInfo.address; ArrayList<String> routeList = new ArrayList<String>(); routeList.add(startAddress); int steps = mWalkRoute.getNumSteps(); for (int i = 0; i < steps; i++) { routeList.add(mWalkRoute.getStep(i).getContent()); System.out.println(mWalkRoute.getStep(i).getContent()); } routeList.add(endAddress); RouteActivity.actionRoute(LocationActivity.this, routeList, RouteActivity.TYPE_WALKING); mWalkRoute = null; } break; default: break; } } } /** TODO 查看驾车路线信息 */ private void getRouteInfo(MKDrivingRouteResult res) { System.out.println("======================驾车路线信息=========================="); MKRouteAddrResult addressResult = res.getAddrResult(); int steps = mDividerRoute.getNumSteps(); for (int i = 0; i < steps; i++) { System.out.println(mDividerRoute.getStep(i).getContent()); } System.out.println("taxi价格 = " + res.getTaxiPrice()); System.out.println("目的地 = " + res.getEnd().name); System.out.println("起始地 = " + res.getStart().name); if (null != addressResult) { ArrayList<ArrayList<MKPoiInfo>> poiList = addressResult.mWpPoiList; for (ArrayList<MKPoiInfo> poi1 : poiList) { for (MKPoiInfo poi2 : poi1) { System.out.println("poi2.name = " + poi2.name); } } } System.out.println("======================驾车路线信息=========================="); } /** TODO 查看步行路线信息 */ private void getWalkInfo(MKWalkingRouteResult res) { System.out.println("======================步行路线信息=========================="); MKRouteAddrResult addressResult = res.getAddrResult(); int steps = mWalkRoute.getNumSteps(); for (int i = 0; i < steps; i++) { System.out.println("|| " + mWalkRoute.getStep(i).getContent()); } System.out.println("|| taxi价格 = " + res.getTaxiPrice()); System.out.println("|| 目的地 = " + res.getEnd().name); System.out.println("|| 起始地 = " + res.getStart().name); if (null != addressResult) { ArrayList<ArrayList<MKPoiInfo>> poiList = addressResult.mWpPoiList; for (ArrayList<MKPoiInfo> poi1 : poiList) { for (MKPoiInfo poi2 : poi1) { System.out.println("poi2.name = " + poi2.name); } } } System.out.println("======================步行路线信息=========================="); } /** TODO SearchView 点击事件 */ private class SearchViewListenerImpl implements OnQueryTextListener, OnCloseListener, OnSuggestionListener { public boolean onQueryTextSubmit(String query) { String city = mPreferences.getString(PREF_LOACTION_CITY, DEFAULT_CITY); mMKSearch.suggestionSearch(query, city); mCursorData = new MatrixCursor(COLUMNS); if (null != mSuggestAdapter) { mSuggestAdapter.changeCursor(mCursorData); mSuggestAdapter.notifyDataSetChanged(); } return true; } public boolean onQueryTextChange(String newText) { String city = mPreferences.getString(PREF_LOACTION_CITY, DEFAULT_CITY); mMKSearch.suggestionSearch(newText, city); mCursorData = new MatrixCursor(COLUMNS); if (null != mSuggestAdapter) { mSuggestAdapter.changeCursor(mCursorData); mSuggestAdapter.notifyDataSetChanged(); } return true; } @Override public boolean onSuggestionSelect(int position) { return false; } public boolean onSuggestionClick(int position) { MatrixCursor cursor = (MatrixCursor) mSuggestAdapter.getItem(position); String searchKey = cursor.getString(1); String city = mPreferences.getString(PREF_LOACTION_CITY, DEFAULT_CITY); mMKSearch.poiSearchInCity(city, searchKey); mSearchView.setQuery("", false); mSearchView.clearFocus(); mSearchView.setIconified(true); return false; } @Override public boolean onClose() { return false; } } private class SuggestionsAdapter extends CursorAdapter { public SuggestionsAdapter(Context context, Cursor c) { super(context, c, 0); } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { LayoutInflater inflater = LayoutInflater.from(context); View v = inflater.inflate(android.R.layout.simple_list_item_1, parent, false); return v; } @Override public void bindView(View view, Context context, Cursor cursor) { TextView tv = (TextView) view; final int textIndex = cursor.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_1); tv.setText(cursor.getString(textIndex)); } } } // ==================================================================================== // ==================================================================================== // 百度定位返回状态码信息 // ==================================================================================== // ==================================================================================== // 61 : GPS定位结果 // 62 : 扫描整合定位依据失败。此时定位结果无效。 // 63 : 网络异常,没有成功向服务器发起请求。此时定位结果无效。 // 65 : 定位缓存的结果。 // 66 : 离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果 // 67 : 离线定位失败。通过requestOfflineLocaiton调用时对应的返回结果 // 68 : 网络连接失败时,查找本地离线定位时对应的返回结果 // 161: 表示网络定位结果 // 162~167: 服务端定位失败 // 502:KEY参数错误 // 505:KEY不存在或者非法 // 601:KEY服务被开发者自己禁用 // 602: KEY Mcode不匹配,意思就是您的ak配置过程中安全码设置有问题,请确保: sha1正确,“;”分号是英文状态;且包名是您当前运行应用的包名 // 501-700:KEY验证失败 // ====================================================================================