基于Android实现百度地图定位过程详解

所属分类: 软件编程 / Android 阅读数: 451
收藏 0 赞 0 分享

一、问题描述

LBS位置服务是android应用中重要的功能,应用越来越广泛,下面我们逐步学习和实现lbs相关的应用如定位、地图、导航等,首先我们看如何基于百度地图实现定位功能

二、配置环境

1、注册密钥:地址http://developer.baidu.com/map/

2、下载定位SDK,并导入SDK如图所示:

 

三、编写MyApplication类

编写MyApplication类,为了使用方便我们可以将实现定位的方法封装的Application组件中

封装下列方法

1、  获取定位信息——requestLocationInfo()

2、  通过广播发送位置信息——sendBroadCast()

3、  停止定位——stopLocationClient()

public class MyApplication extends Application{
  public LocationClient mLocationClient = null;
  public GeofenceClient mGeofenceClient;
  public MyLocationListenner myListener = new MyLocationListenner();
  public static String TAG = "MyApplication";
  private static MyApplication mInstance = null;
  @Override
  public void onCreate(){
    mInstance = this;
    mLocationClient = new LocationClient(this);
    /**
     * 项目的key,自己到官网申请 http://lbsyun.baidu.com/apiconsole/key
     */
    mLocationClient.setAK("你的应用Key");
    mLocationClient.registerLocationListener(myListener);
    mGeofenceClient = new GeofenceClient(this);
    super.onCreate();
    Log.d(TAG, "... Application onCreate... pid=" + Process.myPid());
  }
  public static MyApplication getInstance(){
    return mInstance;
  }
  /**
   * 停止定位
   */
  public void stopLocationClient(){
    if (mLocationClient != null && mLocationClient.isStarted()){
      mLocationClient.stop();
    } 
  }
  /**
   * 发起定位
   */
  public void requestLocationInfo(){
    setLocationOption();
    if (mLocationClient != null && !mLocationClient.isStarted()){
      mLocationClient.start();
    }
    if (mLocationClient != null && mLocationClient.isStarted()){
      mLocationClient.requestLocation();
    } 
  }
  /**
   * 设置百度地图的相关参数
   */
  private void setLocationOption(){
    LocationClientOption option = new LocationClientOption();
    option.setOpenGps(true); // 打开gps
    option.setCoorType("bd09ll"); // 设置坐标类型
    option.setServiceName("com.baidu.location.service_v2.9");
    option.setPoiExtraInfo(true);
    option.setAddrType("all");
    option.setPoiNumber(10);
    option.disableCache(true);
    mLocationClient.setLocOption(option);
  }
  /**
   * 监听函数,有更新位置的时候,格式化成字符串,输出到屏幕中
   */
  public class MyLocationListenner implements BDLocationListener
  {
    @Override
    public void onReceiveLocation(BDLocation location){
      if (location == null){
        sendBroadCast("定位失败!");
        return;
      }
      sendBroadCast(location.getAddrStr());
    }
    public void onReceivePoi(BDLocation poiLocation){
      if (poiLocation == null){
        sendBroadCast("定位失败!");
        return;
      }
      sendBroadCast(poiLocation.getAddrStr());
    }
  }
  /**
   * 得到发送广播
   * @param address
   */
  public void sendBroadCast(String address){
        stopLocationClient();
    Intent intent = new Intent(MainActivity.LOCATION_BCR);
    intent.putExtra("address", address);
    sendBroadcast(intent);
  }
}

三、 主程序MainActivity

public class MainActivity extends Activity{
  public static String TAG = "LocTestDemo";
  private BroadcastReceiver broadcastReceiver;
  public static String LOCATION_BCR = "location_bcr";
  private Button locBtn;
  private TextView locInfo;
  private MyApplication application;
  @Override
  protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    application=(MyApplication)super.getApplication();
    initialize();
    initializeViews();
    initializeListeners();
  }
  private void initialize(){
    registerBroadCastReceiver();//注册广播
  }
  private void initializeViews()
  {
    locBtn = (Button) findViewById(R.id.location);
    locInfo = (TextView) findViewById(R.id.location_info);
  }
  private void initializeListeners()
  {
    locBtn.setOnClickListener(new OnClickListener(){
      @Override
      public void onClick(View v){
        locInfo.setText("定位中...");
      //调用请求定位信息
      application.requestLocationInfo();
      }
    });
  }
  /**
   * 注册一个广播,监听定位结果,接受广播获得地址信息
   */
  private void registerBroadCastReceiver()
  {
    broadcastReceiver = new BroadcastReceiver(){
    public void onReceive(Context context, Intent intent){
      String address = intent.getStringExtra("address");
        locInfo.setText(address);
      }
    };
    IntentFilter intentToReceiveFilter = new IntentFilter();
    intentToReceiveFilter.addAction(LOCATION_BCR);
    registerReceiver(broadcastReceiver, intentToReceiveFilter);
  }
  @Override
  protected void onDestroy(){
    super.onDestroy();
    unregisterReceiver(broadcastReceiver);
  }
}

四、 AndroidManifest.xml配置信息

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.jereh.baidulocation"
  android:versionCode="1"
  android:versionName="1.0" >
  <uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="17" />
  <application
    android:name="com.jereh.baidulocation.MyApplication"
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
      android:name="com.jereh.baidulocation.MainActivity"
      android:label="@string/app_name" >
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
    <service
      android:name="com.baidu.location.f"
      android:enabled="true"
      android:process=":remote" >
      <intent-filter>
        <action android:name="com.baidu.location.service_v2.2" >
        </action>
      </intent-filter>
    </service>
  </application>
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
  </uses-permission>
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
  </uses-permission>
  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
  </uses-permission>
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
  </uses-permission>
  <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
  </uses-permission>
  <uses-permission android:name="android.permission.READ_PHONE_STATE" >
  </uses-permission>
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
  </uses-permission>
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >
  </uses-permission>
  <uses-permission android:name="android.permission.READ_LOGS" >
  </uses-permission>
  <uses-permission android:name="android.permission.VIBRATE" />
  <uses-permission android:name="android.permission.WAKE_LOCK" />
  <uses-permission android:name="android.permission.WRITE_SETTINGS" />
</manifest>
更多精彩内容其他人还在看

android byte[] 和short[]转换的方法代码

这篇文章主要介绍了android byte[] 和short[]转换的方法代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

Android获取应用程序大小的方法

这篇文章主要介绍了Android获取应用程序大小的方法,有需要的朋友可以参考一下
收藏 0 赞 0 分享

Android获取其他包的Context实例代码

这篇文章主要介绍了Android获取其他包的Context实例代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

Android放大镜的实现代码

这篇文章主要介绍了Android放大镜的实现代码,有需要的朋友可以参考一下
收藏 0 赞 0 分享

Android 读取Properties配置文件的小例子

这篇文章主要介绍了Android 读取Properties配置文件的小例子,有需要的朋友可以参考一下
收藏 0 赞 0 分享

Android通讯录开发之删除功能的实现方法

这篇文章主要介绍了Android通讯录开发之删除功能的实现方法,有需要的朋友可以参考一下
收藏 0 赞 0 分享

使用ViewPager实现android软件使用向导功能实现步骤

现在的大部分android软件,都是使用说明,就是第一次使用该软件时,会出现向导,可以左右滑动,然后就进入应用的主界面了,下面我们就实现这个功能
收藏 0 赞 0 分享

android在异步任务中关闭Cursor的代码方法

android在异步任务中如何关闭Cursor?在我们开发应用的时候,很多时候会遇到这种问题,下面我们就看看代码如何实现
收藏 0 赞 0 分享

Android自定义桌面功能代码实现

android自定义桌面其实很简单,看一个例子就明白了
收藏 0 赞 0 分享

android将图片转换存到数据库再从数据库读取转换成图片实现代码

有时候我们想把图片存入到数据库中,尽管这不是一种明智的选择,但有时候还是不得以会用到,下面说说将图片转换成byte[]数组存入到数据库中去,并从数据库中取出来转换成图像显示出来
收藏 0 赞 0 分享
查看更多