首先感谢几位博主的资源,http://blog.chinaunix.net/uid-24178755-id-60470.html
http://blog.sina.com.cn/s/blog_74c22b210100sfix.html
我作为一个初入百度地图开发的小菜鸟,在定位问题上遇到的第一个问题,就是getLastKnownLocation为空,下面也就重点分享一下解决心得和方法,这只是一种,但是我觉得对于那些初学者,绝对有帮助。
LocationManager.getLastKnownLocation()这个方法,返回结果不出意外,一般是空。
关于MapActivity的问题,如果Windows-》Preferences-》android,加入google
API不好是的话,其实MapActivity已经内嵌在高版本的百度地图sdk中了,在高版本的百度地图的sdk已经废弃了了,所以activity和Map从使用上来说是没影响的,不用非要执着去用MapActivity,尤其在2.0以后的百度地图的sdk版本中。
以下代码中的加粗部分,是关于getLastKnownLocation的解决。
直接上代码:
MainActivity.java
package
com.example.baidumaptest;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.map.LocationData;
import com.baidu.mapapi.map.MapController;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationOverlay;
import com.baidu.platform.comapi.basestruct.GeoPoint;
public class MainActivity extends Activity {
private BMapManager manager;
private MapView mapView;
private LocationManager locationManager;
private String provider;
private MapController mapController;
private Button jiejingbut;
private Button weixingbut2;
private Button d3but;
private Button pingmianbut;
LocationListener mLocationListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
manager=new BMapManager(this);
manager.init(APIkey,null);/* 以上两个代码一定要放在setContentView(R,layout.main)前面*/
setContentView(R.layout.main);
mapView=(MapView) findViewById(R.id.map_view);
//设置是否打开卫星图
//mapView.setTraffic(true);
// 设置mapview是否支持双击放大效果
mapView.setDoubleClickZooming(true);
//返回地图的MapController,这个对象可用于控制和驱动平移和缩放。
mapController = mapView.getController();
mapController.setZoom(16);// 设置缩放级别
mapView.setSatellite(true);
mapView.setBuiltInZoomControls(true);
locationManager=(LocationManager) getSystemService(Context.LOCATION_SERVICE);
List<String> providerList=locationManager.getProviders(true);
if(providerList.contains(LocationManager.GPS_PROVIDER)){
provider=LocationManager.GPS_PROVIDER;
}
else if(providerList.contains(LocationManager.NETWORK_PROVIDER)){
provider=LocationManager.NETWORK_PROVIDER;
}
else{
Toast.makeText(this, "NO location provider to use", Toast.LENGTH_SHORT).show();
return ;
}
///////////////////////////
mLocationListener = new LocationListener() {
@Override
public void onLocationChanged(final Location loc) {
Log.i("hehr", "onLocationChanged. loc: " + loc);
if (loc != null) {
Log.i("1233", " location is not null"
+ loc.getLatitude() + " , longtitude: "+loc.getLongitude());
Location location=locationManager.getLastKnownLocation(provider);
navigateTo(location);
} else {
Toast.makeText( getApplicationContext(), "Your current location is temporarily unavailable.",
Toast.LENGTH_SHORT).show();
}
}
public void onProviderDisabled(final String s) {
//可以添加一些代码,
}
public void onProviderEnabled(final String s) {
//
}
public void onStatusChanged(final String s, final int i, final Bundle b) {
//
}
};
}
//这是定位的函数
private void navigateTo(Location location) {
// TODO Auto-generated method stub
MapController controller=mapView.getController();
controller.setZoom(16);
GeoPoint point =new GeoPoint((int)(location.getLatitude()*1E6),(int)(location.getLongitude()*1E6));
controller.setCenter(point);
MyLocationOverlay myLocationOverLay=new MyLocationOverlay(mapView);
LocationData locationData=new LocationData();
locationData.latitude=location.getLatitude();
locationData.longitude=location.getLongitude();
myLocationOverLay.setData(locationData);
mapView.getOverlays().add(myLocationOverLay);
mapView.refresh();
}
protected void onResume(){
mapView.onResume();
if(manager!=null){
manager.start();
}
locationManager.requestLocationUpdates(provider, 60000, 1, mLocationListener);
super.onResume();
}
protected void onPause(){
mapView.onPause();
if(manager!=null){
manager.stop();
}
locationManager.removeUpdates(mLocationListener);
super.onPause();
}
protected void onDestroy(){
mapView.destroy();
if(manager!=null){
manager.destroy();
}
super.onDestroy();
}
}
main.xml
<LinearLayout
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.example.baidumaptest.MainActivity"
android:orientation="vertical" >
<com.baidu.mapapi.map.MapView
android:id="@+id/map_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true" >
</com.baidu.mapapi.map.MapView>
</LinearLayout>
AndroidManifest.xml
//跟百度地图有关的代码
<supports-screens
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:resizeable="true"
android:anyDensity="true"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_GPS" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
大家有什么问题可以在下方留言。