android百度地图定位没法刷新是什么原因?求解
这是应用刚启动时的界面:这个图是位置更新后的模拟器显示:
核心代码:
package com.mackey.gps_wifi;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
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.GeoPoint;
import com.baidu.mapapi.MKEvent;
import com.baidu.mapapi.MKGeneralListener;
import com.baidu.mapapi.MapActivity;
import com.baidu.mapapi.MapController;
import com.baidu.mapapi.MapView;
import com.mackey.MyMenu;
import com.mackey.MyOverlay;
public class MainActivity extends MapActivity {
/*
* 地图控件
*/
private MapView mapView = null;
/*
*百度地图的管理类
*/
private BMapManager bMapManager = null ;
/*
* 百度地图密钥
*/
private static final String BAIDU_MAP_API_KEY = "7D99DC6FE7F9BB79DA8C166CD76FBD812B3A3F9A";
/*
* 在Log中用于标识BMapManager即充当Map的Key作用
*/
private String TAG = "bMapManager";
/*
*MapView的控制器
*/
private MapController mapController = null;
/*
* 定位SDK的核心类
*/
private LocationClient locationClient = null;
/*
* 为客户端服务选项的主类
*/
private LocationClientOption locationClientOption = null;
/*
*我所处位置的 纬度
*/
private double myLocationLatitude = 0;
/*
* 我所处位置的经度
*/
private double myLocationLongitude = 0;
/*
* 图层的数目
*/
private int size = 0;
/*
* 用于显示本地位置的详细信息
*/
private TextView textView = null;
/*
* 我的图层,用于在地图上标识我所处的位置
*/
private MyOverlay myOverlay = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textView = (TextView)findViewById(R.id.textView);
initBMapManager();
initMapView();
setLocationClientOption();
locationClient.registerLocationListener(new MyBDLoactionListener());
locationClient.start();
}
/*
* LocationOption的设置即相关服务的设置
*/
private void setLocationClientOption() {
locationClientOption = new LocationClientOption();
locationClientOption.disableCache(true);
locationClientOption.setOpenGps(true);//开启GPS
locationClientOption.setCoorType("bd09ll");
locationClientOption.setProdName("GPS_WIFI");
locationClientOption.setPriority(LocationClientOption.GpsFirst);
locationClientOption.setAddrType("all");
locationClient = new LocationClient(MainActivity.this);
locationClient.setLocOption(locationClientOption);
}
/*
* 用于初始化地图
*/
private void initMapView() {
mapView = (MapView)findViewById(R.id.mapView);
size = mapView.getOverlays().size();
mapView.setBuiltInZoomControls(true);
mapView.setBuiltInZoomControls(true);//设置启用内置的缩放控件
mapView.setDrawOverlayWhenZooming(true);//设置缩放的过程中显示图层
mapController = mapView.getController();
GeoPoint geoPoint = new GeoPoint((int)(32.05000*1E6),(int)(118.78333*1E6));
mapController.setCenter(geoPoint);
mapController.setZoom(16);
}
/*
* 用于初始化BMapManager
*/
private void initBMapManager(){
bMapManager = new BMapManager(MainActivity.this);
boolean result ;
result = bMapManager.init(BAIDU_MAP_API_KEY,new MKGeneralListener() {
@Override
public void onGetPermissionState(int error) {
if (error == MKEvent.ERROR_NETWORK_CONNECT) {
Toast.makeText(MainActivity.this, "您的网络出错啦!", Toast.LENGTH_LONG).show();
} else if (error == MKEvent.ERROR_NETWORK_DATA) {
Toast.makeText(MainActivity.this, "输入正确的检索条件!", Toast.LENGTH_LONG).show();
}
}
@Override
public void onGetNetworkState(int error) {
if (error == MKEvent.ERROR_PERMISSION_DENIED) {
Toast.makeText(MainActivity.this, "您的授权Key出错!", Toast.LENGTH_LONG).show();
}
}
});
if(!result){
if (!result) {
Toast.makeText(MainActivity.this, "初始化地图引擎失败!", Toast.LENGTH_LONG).show();
} else {
Log.i(TAG, "地图引擎初始化成功!");
}
}
initMapActivity(bMapManager);
}
/*
*用于创建Menu,即手机的菜单选项
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, MyMenu.GENERALVIEW, 1, R.string.GeneralView);
menu.add(1, MyMenu.SATELLITEVIEW, 1, R.string.SATELLITEVIEW);
menu.add(2, MyMenu.MYLOCATION, 1, R.string.about);
menu.add(3, MyMenu.INQUIRY, 1, R.string.inquiry);
return super.onCreateOptionsMenu(menu);
}
/*
* 用于监听Menu中选项的触发,给出相应的反映即行为
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int k = item.getItemId();
switch(k){
case MyMenu.GENERALVIEW:mapView.setSatellite(false);break;
case MyMenu.SATELLITEVIEW:mapView.setSatellite(true);break;
case MyMenu.MYLOCATION:{
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putCharSequence("MYLOCATION",textView.getText());
intent.putExtras(bundle);
intent.setClass(MainActivity.this,MyLocationActivity.class);
MainActivity.this.startActivity(intent);break;
}
case MyMenu.INQUIRY:{
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
Uri uri = Uri.parse("http://map.baidu.com/");
intent.setData(uri);
startActivity(intent);break;
}
}
return super.onOptionsItemSelected(item);
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
/*
* MapActivity的生命周期函数,必须覆写。
* 如果不覆写这些函数,即便有百度地图的
* Key也是无法显示百度地图的。即也就是说明
* 要想显示百度地图需要两个条件:1.百度地图Key
* 2.覆写MapActivity的生命周期函数。
*/
protected void onDestroy() {
if(bMapManager!=null){
bMapManager.destroy();
bMapManager = null;
}
super.onDestroy();
}
@Override
protected void onPause() {
if(bMapManager!=null){
super.onPause();
bMapManager.stop();
}
}
@Override
protected void onResume() {
if(bMapManager!=null){
super.onResume();
bMapManager.start();
}
}
/*
* 实现位置监听,实时缓存我的位置
*/
public class MyBDLoactionListener implements BDLocationListener{
@Override
public void onReceiveLocation(BDLocation bdLocation) {
if(bdLocation==null){
return;
}else{
markLocationOnMap(bdLocation);
showMyLocation(bdLocation);
}
}
@Override
public void onReceivePoi(BDLocation arg0) {
}
}
/*
* 在地图上标出我所处的位置
*/
private void markLocationOnMap(BDLocation bdLocation) {
myLocationLatitude = bdLocation.getLatitude();
myLocationLongitude = bdLocation.getLongitude();
GeoPoint geoPoint = new GeoPoint((int)(myLocationLatitude* 1E6),(int)(myLocationLongitude* 1E6));
mapController.setZoom(16);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.point_where);
myOverlay = new MyOverlay(null, mapView, bitmap,geoPoint,size);
myOverlay.addMyOverlay(myOverlay, bitmap,geoPoint);
//mapController.animateTo(geoPoint);
}
/*
* 用于显示我所处位置的详细信息,不过为了使得界面
* 更人性化,这里采用先使得TextView不显示,待用户
* 出发相应Menu菜单要求显示时才会显示。
*/
private void showMyLocation(BDLocation bdLocation) {
StringBuffer sb = new StringBuffer(256);
sb.append(" time : ");
sb.append(bdLocation.getTime());
sb.append("\n error code : ");
sb.append(bdLocation.getLocType());
sb.append("\n latitude : ");
sb.append(bdLocation.getLatitude());
sb.append("\n lontitude : ");
sb.append(bdLocation.getLongitude());
// 判断是否有定位精度半径
if(bdLocation.hasRadius()){
sb.append("\n radius : ");
sb.append(bdLocation.getRadius());
}
if (bdLocation.getLocType()==BDLocation.TypeGpsLocation){
if (bdLocation.hasSpeed()){
sb.append("\n speed : ");
sb.append(bdLocation.getSpeed());
}
if (bdLocation.hasSateNumber()) {
sb.append("\n satellite : ");
sb.append(bdLocation.getSatelliteNumber());
}
} else if (bdLocation.getLocType()==BDLocation.TypeNetWorkLocation) {
// 获取反地理编码。 只有使用网络定位的情况下,才能获取当前位置的反地理编码描述。详细参见百度开发者中心百度定位API
if (bdLocation.hasAddr()) {
String address = bdLocation.getAddrStr();
sb.append("\n addr : ");
sb.append(address);
}
}
textView.setText(sb);
}
}
补充:移动开发 , Android