android学习难点解决之(一)百度地图的定位---getLastKnownLocation为空和MapActivity

这篇博客主要介绍了在Android开发中遇到的百度地图定位问题,即LocationManager.getLastKnownLocation()返回为空的解决办法。作者分享了通过监听位置更新来获取位置信息的解决方案,并指出在高版本的百度地图SDK中,MapActivity已内嵌,不再需要单独使用。此外,博客还提供了相关代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先感谢几位博主的资源,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" />


大家有什么问题可以在下方留言。

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值