转载请注明出处:
http://blog.csdn.net/iwanghang/article/details/53307215
显示检索结果&定位&显示我的位置,这里使用的是Android定位SDK
我们直接看一下环境配置,jar包我们在之前已经导入完成了,这边不演示,看下图添加一下权限和jniLibs的设置
看下动态GIF效果、图片说明以及代码~~
MainActivity.java:
activity_main.xml:
转载请注明出处: http://blog.csdn.net/iwanghang/article/details/53307215
显示检索结果&定位&显示我的位置,这里使用的是Android定位SDK
我们直接看一下环境配置,jar包我们在之前已经导入完成了,这边不演示,看下图添加一下权限和jniLibs的设置
看下动态GIF效果、图片说明以及代码~~
MainActivity.java:
package com.demo1;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.busline.BusLineSearch;
import com.baidu.mapapi.search.core.PoiInfo;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener;
import com.baidu.mapapi.search.poi.PoiCitySearchOption;
import com.baidu.mapapi.search.poi.PoiDetailResult;
import com.baidu.mapapi.search.poi.PoiIndoorResult;
import com.baidu.mapapi.search.poi.PoiResult;
import com.baidu.mapapi.search.poi.PoiSearch;
import java.util.List;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.BDNotifyListener; // 假如用到位置提醒功能,需要import该类
import com.baidu.location.Poi;
import com.baidu.location.LocationClientOption.LocationMode;
public class MainActivity extends AppCompatActivity {
private MapView mMapView = null;
private BaiduMap mBaiduMap;
// POI兴趣点检索
private PoiSearch mPoiSearch;
private PoiSearch mPoiSearchBus;
// POI公交信息检索
private String busLineId;
private BusLineSearch mBusLineSearch;
// 定位
public LocationClient mLocationClient = null;
//public BDLocationListener myListener = new MyLocationListener(); // 位置监听器
public BDLocationListener myListener; // 位置监听器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 在使用SDK各组件之前初始化context信息,传入ApplicationContext
// 注意该方法要再setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
// 获取地图控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); // 普通地图
// POI兴趣点检索初始化
initPOI();
// POI公交信息检索初始化
// POI公交信息检索初始化
initBus();
// 定位
myListener = new MyLocationListener();
mLocationClient = new LocationClient(getApplicationContext()); //声明LocationClient类
mLocationClient.registerLocationListener( myListener ); //注册监听函数
// 注册 SDK 广播监听者
IntentFilter iFilter = new IntentFilter();
iFilter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_OK);
iFilter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR);
iFilter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);
mReceiver = new SDKReceiver();
registerReceiver(mReceiver, iFilter);
}
private void initLocation(){
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationMode.Hight_Accuracy
);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系
int span=5000;
option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
option.setOpenGps(true);//可选,默认false,设置是否使用gps
option.setLocationNotify(true);//可选,默认false,设置是否当GPS有效时按照1S/1次频率输出GPS结果
option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
option.setIgnoreKillProcess(false);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集
option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤GPS仿真结果,默认需要
mLocationClient.setLocOption(option);
mLocationClient.start();
mLocationClient.requestLocation(); // 发送请求
}
public void mylocationClick(View view){
initLocation();
}
private void initBus() {
// POI检索
mPoiSearchBus = PoiSearch.newInstance(); // 创建POI检索实例
// 创建POI检索监听者;
OnGetPoiSearchResultListener poiListenerBus = new OnGetPoiSearchResultListener(){
@Override
public void onGetPoiResult(PoiResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
return;
}
//遍历所有POI,找到类型为公交线路的POI
for (PoiInfo poi : result.getAllPoi()) {
if (poi.type == PoiInfo.POITYPE.BUS_LINE ||poi.type == PoiInfo.POITYPE.SUBWAY_LINE) {
//说明该条POI为公交信息,获取该条POI的UID
busLineId = poi.uid;
System.out.println(poi.name+"--"+poi.uid+"--"+poi.city);
Toast.makeText(MainActivity.this, poi.name+"--"+poi.uid+"--"+poi.city, Toast.LENGTH_SHORT).show();
break;
}
}
}
@Override
public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {
}
@Override
public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {
}
};
// 设置POI检索监听者;
mPoiSearchBus.setOnGetPoiSearchResultListener(poiListenerBus);
}
public void poiBus(View view){
// 发起检索请求;异步请求;
// 以城市内检索为例,详细方法请参考POI检索部分的相关介绍
mPoiSearchBus.searchInCity((new PoiCitySearchOption())
.city("北京")
.keyword("717"));
// 释放POI检索实例;
//mPoiSearchBus.destroy();
}
private void initPOI() {
// POI检索
mPoiSearch = PoiSearch.newInstance(); // 创建POI检索实例
// 创建POI检索监听者;
OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener(){
public void onGetPoiResult(PoiResult result){
// 获取POI检索结果
List<PoiInfo> allPoi = result.getAllPoi();
for (PoiInfo p : allPoi) {
System.out.println(p.address+"--"+p.city+"--"+p.name);
Toast.makeText(MainActivity.this, p.address+"--"+p.city+"--"+p.name, Toast.LENGTH_SHORT).show();
// 在地图上显示结果
BitmapDescriptor bitmap = BitmapDescriptorFactory
.fromResource(R.mipmap.ic_launcher); // 图标
OverlayOptions options = new MarkerOptions()
.position(p.location).icon(bitmap); // 创建图层
mBaiduMap.addOverlay(options);
}
}
public void onGetPoiDetailResult(PoiDetailResult result){
//获取Place详情页检索结果
}
@Override
public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {
}
};
// 设置POI检索监听者;
mPoiSearch.setOnGetPoiSearchResultListener(poiListener);
}
public void poiClick(View view){
// 发起检索请求;异步请求;
mPoiSearch.searchInCity((new PoiCitySearchOption())
.city("北京")
.keyword("美食")
.pageNum(10));
// 释放POI检索实例;
//mPoiSearch.destroy();
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
mLocationClient.stop();
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}
/**
* 构造广播监听类,监听 SDK key 验证以及网络异常广播
*/
public class SDKReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
String s = intent.getAction();
TextView text = (TextView) findViewById(R.id.text_Info);
text.setTextColor(Color.RED);
if (s.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)) {
text.setText("key 验证出错! 错误码 :" + intent.getIntExtra
(SDKInitializer.SDK_BROADTCAST_INTENT_EXTRA_INFO_KEY_ERROR_CODE, 0)
+ " ; 请在 AndroidManifest.xml 文件中检查 key 设置");
} else if (s.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_OK)) {
text.setText("key 验证成功! 功能可以正常使用");
text.setTextColor(Color.BLACK);
} else if (s.equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)) {
text.setText("网络出错");
}
}
}
private SDKReceiver mReceiver;
/**
* 位置监听器
*/
public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) { // 接收位置信息的回调方法
//Receive Location
StringBuffer sb = new StringBuffer(256);
sb.append("time : ");
sb.append(location.getTime());
sb.append("\nerror code : ");
sb.append(location.getLocType());
sb.append("\nlatitude : ");
sb.append(location.getLatitude());
sb.append("\nlontitude : ");
sb.append(location.getLongitude());
sb.append("\nradius : ");
sb.append(location.getRadius());
if (location.getLocType() == BDLocation.TypeGpsLocation){// GPS定位结果
sb.append("\nspeed : ");
sb.append(location.getSpeed());// 单位:公里每小时
sb.append("\nsatellite : ");
sb.append(location.getSatelliteNumber());
sb.append("\nheight : ");
sb.append(location.getAltitude());// 单位:米
sb.append("\ndirection : ");
sb.append(location.getDirection());// 单位度
sb.append("\naddr : ");
sb.append(location.getAddrStr());
sb.append("\ndescribe : ");
sb.append("gps定位成功");
} else if (location.getLocType() == BDLocation.TypeNetWorkLocation){// 网络定位结果
sb.append("\naddr : ");
sb.append(location.getAddrStr());
//运营商信息
sb.append("\noperationers : ");
sb.append(location.getOperators());
sb.append("\ndescribe : ");
sb.append("网络定位成功");
} else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果
sb.append("\ndescribe : ");
sb.append("离线定位成功,离线定位结果也是有效的");
} else if (location.getLocType() == BDLocation.TypeServerError) {
sb.append("\ndescribe : ");
sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因");
} else if (location.getLocType() == BDLocation.TypeNetWorkException) {
sb.append("\ndescribe : ");
sb.append("网络不同导致定位失败,请检查网络是否通畅");
} else if (location.getLocType() == BDLocation.TypeCriteriaException) {
sb.append("\ndescribe : ");
sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");
}
sb.append("\nlocationdescribe : ");
sb.append(location.getLocationDescribe());// 位置语义化信息
List<Poi> list = location.getPoiList();// POI数据
if (list != null) {
sb.append("\npoilist size = : ");
sb.append(list.size());
for (Poi p : list) {
sb.append("\npoi= : ");
sb.append(p.getId() + " " + p.getName() + " " + p.getRank());
}
}
Log.i("BaiduLocationApiDemo", sb.toString());
Toast.makeText(getApplicationContext(), sb.toString(), Toast.LENGTH_SHORT).show();
// 在地图上显示结果
BitmapDescriptor bitmap = BitmapDescriptorFactory
.fromResource(R.mipmap.ic_launcher); // 图标
LatLng latLng = new LatLng(location.getLatitude(),location.getLongitude());
OverlayOptions options = new MarkerOptions()
.position(latLng).icon(bitmap); // 创建图层
mBaiduMap.addOverlay(options);
}
}
}
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.demo1.MainActivity">
<TextView
android:id="@+id/text_Info"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="16sp" >
</TextView>
<Button
android:text="poi检索"
android:onClick="poiClick"
android:id="@+id/btn_poi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/text_Info"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<Button
android:text="bus检索"
android:onClick="poiBus"
android:id="@+id/btn_bus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/text_Info"
android:layout_toRightOf="@+id/btn_poi"
android:layout_toEndOf="@+id/btn_poi" />
<Button
android:text="定位"
android:onClick="mylocationClick"
android:id="@+id/btn_mylocation"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/text_Info"
android:layout_toRightOf="@+id/btn_bus"
android:layout_toEndOf="@+id/btn_bus" />
<com.baidu.mapapi.map.MapView
android:layout_below="@+id/btn_bus"
android:id="@+id/bmapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true" />
</RelativeLayout>
转载请注明出处: http://blog.csdn.net/iwanghang/article/details/53307215
欢迎移动开发爱好者交流
沈阳或周边城市公司有意开发Android,请与我联系
联系方式
微信:iwanghang
QQ:413711276
邮箱:iwanghang@qq.com
沈阳或周边城市公司有意开发Android,请与我联系
联系方式
微信:iwanghang
QQ:413711276
邮箱:iwanghang@qq.com