返回信息流我正在向Android项目中添加POI搜索功能,由于项目是用的是2.1.2版本的API,而且用到了GraphicsOverlay,而我想用新的3.0.0版本的POI检索,但是新版本的.jar中就缺失了几何绘制图层功能以至于更新所有的包后项目就出错了。如果沿用旧版本的话,因为其DEMO里面是新写了一个application来实现的地图的各个功能的,但现在我现在不能轻易修改application,所以不知道怎么来实现这个POI检索的功能,有没有大神指导一下,万分感谢!!!
这是一条镜像帖。来源:北邮人论坛 / mobile-terminal-at / #23188同步于 2015/6/25
该镜像源已超过 30 天没有更新,可能在源站已被删除。
MobileTerminalAT机器人发帖
Android开发引用百度地图紧急求助!!!
smallqiang
2015/6/25镜像同步11 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
不知道你所说的GraphicsOverlay要实现什么功能,我看了下API,有PoiOverlay(http://wiki.lbsyun.baidu.com/cms/androidsdk/doc/v3_5_0/html/)这个类啊。
标记地图Marker的话,我是用OverlayOptions构建的。
GraphicsOverlay实现的是几何图形的绘制,在2.1.2版本中有那个类但新版本的jar包中没有了。因为原来的工程里用到了GraphicsOverlay,所以还不能用新的包代替旧版本的。我自己根据提供的demo用新版本的Poi检索没问题,可是引入新的.jar包会导致复引入的错误。如果用旧版本的来写poi检索的话由于它白日提供的demo中是自定义了一个application,所以不知道不自定义application应该怎么来写
【 在 lixing 的大作中提到: 】
: 不知道你所说的GraphicsOverlay要实现什么功能,我看了下API,有PoiOverlay(http://wiki.lbsyun.baidu.com/cms/androidsdk/doc/v3_5_0/html/)这个类啊。
: 标记地图Marker的话,我是用OverlayOptions构建的。
【 在 smallqiang 的大作中提到: 】
: GraphicsOverlay实现的是几何图形的绘制,在2.1.2版本中有那个类但新版本的jar包中没有了。因为原来的工程里用到了GraphicsOverlay,所以还不能用新的包代替旧版本的。我自己根据提供的demo用新版本的Poi检索没问题,可是引入新的.jar包会导致复引入的错误。如果用旧版本的来写poi检索的话由于它白日提供的demo中是自定义了一个application,所以不知道不自定义application应该怎么来写
你说的application指什么?官方的POI检索没有需要定义Application啊。
http://developer.baidu.com/map/index.php?title=androidsdk/guide/retrieval
你贴代码吧。
这是2.1.2版本给出的demo,它的整个demo都用了自定义的application,和目前最新版本的是不一样的,下面有加粗的部分就是用的自定义的application
package baidumapsdk.demo;
import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.EditText;
import android.widget.Toast;
import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.search.MKAddrInfo;
import com.baidu.mapapi.search.MKBusLineResult;
import com.baidu.mapapi.search.MKDrivingRouteResult;
import com.baidu.mapapi.search.MKPoiInfo;
import com.baidu.mapapi.search.MKPoiResult;
import com.baidu.mapapi.search.MKSearch;
import com.baidu.mapapi.search.MKSearchListener;
import com.baidu.mapapi.search.MKSuggestionInfo;
import com.baidu.mapapi.search.MKSuggestionResult;
import com.baidu.mapapi.search.MKTransitRouteResult;
import com.baidu.mapapi.search.MKWalkingRouteResult;
/**
* 演示poi搜索功能
*/
public class PoiSearchDemo extends Activity {
private MapView mMapView = null;
private MKSearch mSearch = null; // 搜索模块,也可去掉地图模块独立使用
/**
* 搜索关键字输入窗口
*/
private AutoCompleteTextView keyWorldsView = null;
private ArrayAdapter<String> sugAdapter = null;
private int load_Index;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DemoApplication app = (DemoApplication)this.getApplication();
if (app.mBMapManager == null) {
app.mBMapManager = new BMapManager(this);
app.mBMapManager.init(DemoApplication.strKey,new DemoApplication.MyGeneralListener());
}
setContentView(R.layout.activity_poisearch);
mMapView = (MapView)findViewById(R.id.bmapView);
mMapView.getController().enableClick(true);
mMapView.getController().setZoom(12);
// 初始化搜索模块,注册搜索事件监听
mSearch = new MKSearch();
mSearch.init(app.mBMapManager, new MKSearchListener(){
//在此处理详情页结果
@Override
public void onGetPoiDetailSearchResult(int type, int error) {
if (error != 0) {
Toast.makeText(PoiSearchDemo.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(PoiSearchDemo.this, "成功,查看详情页面", Toast.LENGTH_SHORT).show();
}
}
/**
* 在此处理poi搜索结果
*/
public void onGetPoiResult(MKPoiResult res, int type, int error) {
// 错误号可参考MKEvent中的定义
if (error != 0 || res == null) {
Toast.makeText(PoiSearchDemo.this, "抱歉,未找到结果", Toast.LENGTH_LONG).show();
return;
}
// 将地图移动到第一个POI中心点
if (res.getCurrentNumPois() > 0) {
// 将poi结果显示到地图上
MyPoiOverlay poiOverlay = new MyPoiOverlay(PoiSearchDemo.this, mMapView, mSearch);
poiOverlay.setData(res.getAllPoi());
mMapView.getOverlays().clear();
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(PoiSearchDemo.this, strInfo, Toast.LENGTH_LONG).show();
}
}
public void onGetDrivingRouteResult(MKDrivingRouteResult res,
int error) {
}
public void onGetTransitRouteResult(MKTransitRouteResult res,
int error) {
}
public void onGetWalkingRouteResult(MKWalkingRouteResult res,
int error) {
}
public void onGetAddrResult(MKAddrInfo res, int error) {
}
public void onGetBusDetailResult(MKBusLineResult result, int iError) {
}
/**
* 更新建议列表
*/
@Override
public void onGetSuggestionResult(MKSuggestionResult res, int arg1) {
if ( res == null || res.getAllSuggestions() == null){
return ;
}
sugAdapter.clear();
for ( MKSuggestionInfo info : res.getAllSuggestions()){
if ( info.key != null)
sugAdapter.add(info.key);
}
sugAdapter.notifyDataSetChanged();
}
});
keyWorldsView = (AutoCompleteTextView) findViewById(R.id.searchkey);
sugAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line);
keyWorldsView.setAdapter(sugAdapter);
/**
* 当输入关键字变化时,动态更新建议列表
*/
keyWorldsView.addTextChangedListener(new TextWatcher(){
@Override
public void afterTextChanged(Editable arg0) {
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1,
int arg2, int arg3) {
}
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2,
int arg3) {
if ( cs.length() <=0 ){
return ;
}
String city = ((EditText)findViewById(R.id.city)).getText().toString();
/**
* 使用建议搜索服务获取建议列表,结果在onSuggestionResult()中更新
*/
mSearch.suggestionSearch(cs.toString(), city);
}
});
}
@Override
protected void onPause() {
mMapView.onPause();
super.onPause();
}
@Override
protected void onResume() {
mMapView.onResume();
super.onResume();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mMapView.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mMapView.onRestoreInstanceState(savedInstanceState);
}
private void initMapView() {
mMapView.setLongClickable(true);
mMapView.getController().setZoom(14);
mMapView.getController().enableClick(true);
mMapView.setBuiltInZoomControls(true);
}
/**
* 影响搜索按钮点击事件
* @param v
*/
public void searchButtonProcess(View v) {
EditText editCity = (EditText)findViewById(R.id.city);
EditText editSearchKey = (EditText)findViewById(R.id.searchkey);
mSearch.poiSearchInCity(editCity.getText().toString(),
editSearchKey.getText().toString());
}
public void goToNextPage(View v) {
//搜索下一组poi
int flag = mSearch.goToPoiPage(++load_Index);
if (flag != 0) {
Toast.makeText(PoiSearchDemo.this, "先搜索开始,然后再搜索下一组数据", Toast.LENGTH_SHORT).show();
}
}
}
【 在 lixing 的大作中提到: 】
: 你说的application指什么?官方的POI检索没有需要定义Application啊。
: http://developer.baidu.com/map/index.php?title=androidsdk/guide/retrieval
: 你贴代码吧。
这个是自定义的application
package baidumapsdk.demo;
import android.app.Application;
import android.content.Context;
import android.widget.Toast;
import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.MKGeneralListener;
import com.baidu.mapapi.map.MKEvent;
public class DemoApplication extends Application {
private static DemoApplication mInstance = null;
public boolean m_bKeyRight = true;
BMapManager mBMapManager = null;
public static final String strKey = "请输入你的key";
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
initEngineManager(this);
}
public void initEngineManager(Context context) {
if (mBMapManager == null) {
mBMapManager = new BMapManager(context);
}
if (!mBMapManager.init(strKey,new MyGeneralListener())) {
Toast.makeText(DemoApplication.getInstance().getApplicationContext(),
"BMapManager 初始化错误!", Toast.LENGTH_LONG).show();
}
}
public static DemoApplication getInstance() {
return mInstance;
}
// 常用事件监听,用来处理通常的网络错误,授权验证错误等
static class MyGeneralListener implements MKGeneralListener {
@Override
public void onGetNetworkState(int iError) {
if (iError == MKEvent.ERROR_NETWORK_CONNECT) {
Toast.makeText(DemoApplication.getInstance().getApplicationContext(), "您的网络出错啦!",
Toast.LENGTH_LONG).show();
}
else if (iError == MKEvent.ERROR_NETWORK_DATA) {
Toast.makeText(DemoApplication.getInstance().getApplicationContext(), "输入正确的检索条件!",
Toast.LENGTH_LONG).show();
}
// ...
}
@Override
public void onGetPermissionState(int iError) {
if (iError == MKEvent.ERROR_PERMISSION_DENIED) {
//授权Key错误:
Toast.makeText(DemoApplication.getInstance().getApplicationContext(),
"请在 DemoApplication.java文件输入正确的授权Key!", Toast.LENGTH_LONG).show();
DemoApplication.getInstance().m_bKeyRight = false;
}
}
}
}
【 在 lixing 的大作中提到: 】
: 你说的application指什么?官方的POI检索没有需要定义Application啊。
: http://developer.baidu.com/map/index.php?title=androidsdk/guide/retrieval
: 你贴代码吧。
【 在 smallqiang 的大作中提到: 】
: 这个是自定义的application
: package baidumapsdk.demo;
:
: ...................
在你的主Acitivity里实现这个Application的功能就可以了。你从代码也可以看出,这个DemoApplication不过是实现了初始化BMapManager、注册Key这两个功能。
我试试吧,因为是要向原来的项目中添加一个新功能,不知道对原项目有没有影响,谢谢啦!!!
【 在 lixing 的大作中提到: 】
:
: 在你的主Acitivity里实现这个Application的功能就可以了。你从代码也可以看出,这个DemoApplication不过是实现了初始化BMapManager、注册Key这两个功能。
【 在 smallqiang 的大作中提到: 】
: 我试试吧,因为是要向原来的项目中添加一个新功能,不知道对原项目有没有影响,谢谢啦!!!
如果你不需要全局使用百度地图的话,没必要在你的主Application里添加。哪个Activity用,就在哪个Activity加就可以了。
那也是要在manifest文件中配置的吧,那样不会影响默认的application吗
【 在 lixing 的大作中提到: 】
: 如果你不需要全局使用百度地图的话,没必要在你的主Application里添加。哪个Activity用,就在哪个Activity加就可以了。