您的位置:首页 > 移动开发 > Android开发

Android 应用集成百度地图开发和注意事项

2013-01-06 13:58 357 查看
首先说一下注意事项:之前测试过百度的地图,现在要加一个餐饮店的详情页,没留意官网更新,就直接把以前下载的包拿来用,结果MKSearchListener里没有poiDetailSearch这个方法,然后去官网下载了个新包,加载上之后运行,点击查到的兴趣点的时候出错了,报的是空指针,又没提示在哪一行,各种验证之后无果,没办法,然后我把错误信息复制到度娘那里去找,居然只有一个人遇到这个问题,而且还没有解决,再后来下载一个新版本的demo,才知道原来是新版本里面有些方法和之前的写法不一样了,我把包换成原来的,运行正常!!,让我纳闷半天,以为不小心改动了什么地方呐,-
-!

废话不多说了,下面这是目前最新的版本,正好新增功能就是我需要的那个




2012年12月3日
Android SDK: V1.3.5

新增:

开放餐饮类Place详情页
支持LBS云检索,实现用户数据地图展现,新增云检索类

然后就是实现全过程了:

首先是准备工作:
加权限
<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>
<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
加包
在项目Libraries里添加baidumapapi.jar,将libBMapApiEngine_v1_3_5.so复制到工程目录下的libs\armeabi



布局文件main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

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

</LinearLayout>


然后就是重点了

import java.util.ArrayList;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.Toast;

import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.GeoPoint;
import com.baidu.mapapi.MKAddrInfo;
import com.baidu.mapapi.MKBusLineResult;
import com.baidu.mapapi.MKDrivingRouteResult;
import com.baidu.mapapi.MKPoiInfo;
import com.baidu.mapapi.MKPoiResult;
import com.baidu.mapapi.MKSearch;
import com.baidu.mapapi.MKSearchListener;
import com.baidu.mapapi.MKSuggestionResult;
import com.baidu.mapapi.MKTransitRouteResult;
import com.baidu.mapapi.MKWalkingRouteResult;
import com.baidu.mapapi.MapController;
import com.baidu.mapapi.MapView;
import com.baidu.mapapi.Overlay;
import com.baidu.mapapi.PoiOverlay;

public class LocaMapActivity extends com.baidu.mapapi.MapActivity {
private BMapManager mapmanager = null;
private LocationManager mlocmanager = null;
private double mLat;
private double mLon;
private MapView mMapView = null;
private MKSearch mkserach = null;
private String name;
private int juli;
MKPoiResult mRes = null;    // poi检索结果
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.locamap);
init();
mkserach = new MKSearch();
mkserach.init(mapmanager, new MySearchListener());// 注意,MKSearchListener只支持一个,以最后一次设置为准

name = this.getIntent().getExtras().getString("name");
juli = Integer.parseInt(this.getIntent().getExtras().getString("juli"));

// 查找周边商户(name和juli是用户选择的查询条件 name:餐饮,酒店,ATM之类的,juli是500,1000,2000)
mkserach.poiSearchNearBy(name, new GeoPoint((int) (34.824349 * 1E6),(int) (113.688586 * 1E6)), juli);

}

@Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}

private void init() {
// 默认坐标
mLat = 34.824349;
mLon = 113.688586;

mapmanager = new BMapManager(LocaMapActivity.this);
mapmanager.init("4B5C387B4901FB04FD45150A6628E95E6B2E68F0", null);
mapmanager.start();
super.initMapActivity(mapmanager);
mMapView = (MapView) findViewById(R.id.loca_mapView);
mMapView.setBuiltInZoomControls(true); // 设置启用内置的缩放控件
MapController mMapController = mMapView.getController(); // 得到mMapView的控制权,可以用它控制和驱动平移和缩放
GeoPoint point = new GeoPoint((int) (mLat * 1E6), (int) (mLon * 1E6));//用默认的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6)
mMapController.setCenter(point); // 设置地图中心点
mMapController.setZoom(16); // 设置地图zoom级别

mMapView.setTraffic(true);// 交通图
// mMapView.setSatellite(true);//卫星图

mMapView.getOverlays().add(new MyOverlay());

mMapView.getOverlays().add(new PoiOverlay(LocaMapActivity.this, mMapView, mkserach)); // 添加ItemizedOverlay实例到mMapView
}

/*
* Overlay:覆盖物的抽象基类,所有的覆盖物均继承此类的方法,实现用户自定义图层显示。
* MyLocationOverlay:一个负责显示用户当前位置的Overlay。
*ItemizedOverlay<Item extends OverlayItem >:Overlay的一个基类,包含了一个OverlayItem列表,相当于一组分条的Overlay,通过继承此类,将一组兴趣点显示在地图上。
* PoiOverlay:本地搜索图层,提供某一特定地区的位置搜索服务,比如在北京市搜索“公园”,通过此图层将公园显示在地图上。
*/
public class MyOverlay extends Overlay {
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
mLat = 34.824349;
mLon = 113.688586;
GeoPoint geoPoint = new GeoPoint((int) (mLat * 1E6),
(int) (mLon * 1E6));
Paint paint = new Paint();
// 在当前的位置绘制一个String
Point point = mMapView.getProjection().toPixels(geoPoint, null);
canvas.drawText("★默认当前位置", point.x, point.y, paint);
}
}

/**
* @author Administrator 搜索服务
*         百度地图移动版API集成搜索服务包括:位置检索、周边检索、范围检索、公交检索、驾乘检索、步行检索,
*         通过初始化MKSearch类,注册搜索结果的监听对象MKSearchListener,实现异步搜索服务。
*         首先自定义MySearchListener实现MKSearchListener接口,通过不同的回调方法,获得搜索结果:
*/
class MySearchListener implements MKSearchListener {

@Override
public void onGetWalkingRouteResult(MKWalkingRouteResult arg0, int arg1) {
// TODO Auto-generated method stub

}

@Override
public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) {
// TODO Auto-generated method stub

}

@Override
public void onGetPoiResult(MKPoiResult result, int arg1, int error) {
if (result == null) {
return;
}
mRes=result;
PoiOverlay poioverlay = new PoiOverlay(LocaMapActivity.this, mMapView,mkserach);
poioverlay.setData(result.getAllPoi());
mMapView.getOverlays().clear();
mMapView.getOverlays().add(poioverlay);
mMapView.invalidate();  //刷新地图
mMapView.getController().animateTo(result.getPoi(0).pt);
}

@Override
public void onGetDrivingRouteResult(MKDrivingRouteResult arg0, int arg1) {
// TODO Auto-generated method stub

}

@Override
public void onGetAddrResult(MKAddrInfo arg0, int arg1) {
// TODO Auto-generated method stub

}

@Override
public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {
// TODO Auto-generated method stub

}

@Override
public void onGetPoiDetailSearchResult(int arg0, int error) {
// TODO Auto-generated method stub
try {

if (error!=0) {
Toast.makeText(LocaMapActivity.this, "未找到商户详细信息", Toast.LENGTH_SHORT).show();
}else{
if (mRes != null) {
ArrayList<MKPoiInfo> allPoi = mRes.getAllPoi();
if (allPoi.get(0).hasCaterDetails) {
mkserach.poiDetailSearch(allPoi.get(0).uid);
}
}
}
} catch (Exception e) {
// TODO: handle exception
Toast.makeText(LocaMapActivity.this, e.toString(), 1000).show();
}

}

@Override
public void onGetRGCShareUrlResult(String arg0, int arg1) {
// TODO Auto-generated method stub

}

@Override
public void onGetSuggestionResult(MKSuggestionResult result, int arg1) {
// TODO Auto-generated method stub

}
}
protected void onDestroy() {
if (mapmanager != null) {
mapmanager.destroy();
mapmanager = null;
}
super.onDestroy();
}

@Override
protected void onPause() {
if (mapmanager != null) {
mapmanager.stop();
}
super.onPause();
}

@Override
protected void onResume() {
if (mapmanager != null) {
mapmanager.start();
}
super.onResume();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: