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

一、问题描述

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>
(0)

相关推荐

  • Android实现GPS定位代码实例

    通过GPS取得的是一个Location类型的经纬度, 可以转换为两个Double 纬度和经度. 纬度: 23.223871812820435 纬度: 113.58986039161628 首先创建一个TextView和两个Button <TextView android:id="@+id/text" android:layout_width="fill_parent" android:layout_height="wrap_content"

  • Android百度地图定位后获取周边位置的实现代码

    本文实例讲解Android百度地图定位后获取周边位置的实现代码,分享给大家供大家参考,具体内容如下 效果图: 具体代码: 1.布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical&q

  • 基于Android实现点击某个按钮让菜单选项从按钮周围指定位置弹出

    Android Material Design:PopupMenu Android Material Design 引入的PopupMenu类似过去的上下文菜单,但是更灵活. 如图所示: 现在给出实现上图PopupMenu的代码. 本例是一个普通的Button触发弹出PopupMenu. 测试的MainActivity.java : package zhangphil.materialdesign; import android.app.Activity; import android.os.B

  • Android GridView实现滚动到指定位置的方法

    当一个列表项目很多,并且每个项目可以进入到其它Activity或者Fragment时,保存之前列表的位置是一个比较不错的功能, 今天研究了一下怎么保存浏览位置,发现GridView和它的父类中有4个相关的方法: 复制代码 代码如下: public void smoothScrollToPosition (int position) 滚动到position指定的位置,api level 11之下可用 *当你滚动完后,返回列表,能正常滚动,但是你再次从列表的项目返回后,滚动失效,就是只能滚动一次,我

  • android通过gps获取定位的位置数据和gps经纬度

    复制代码 代码如下: package com.action.android_test;import android.location.Location;import android.location.LocationListener;import android.location.LocationManager;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.

  • android 定位的4种方式介绍

    android 定位一般有四种方法,这四种方式分别是:GPS定位,WIFI定准,基站定位,AGPS定位,                               (1)Android GPS:需要GPS硬件支持,直接和卫星交互来获取当前经纬度,这种方式需要手机支持GPS模块(现在大部分的智能机应该都有了).通过GPS方式准确度是最高的,但是它的缺点也非常明显:1,比较耗电:2,绝大部分用户默认不开启GPS模块:3,从GPS模块启动到获取第一次定位数据,可能需要比较长的时间:4,室内几乎无法使

  • 在Android里完美实现基站和WIFI定位

    不过其实只要明白了基站/WIFI定位的原理,自己实现基站/WIFI定位其实不难.基站定位一般有几种,第一种是利用手机附近的三个基站进行三角定位,由于每个基站的位置是固定的,利用电磁波在这三个基站间中转所需要时间来算出手机所在的坐标:第二种则是利用获取最近的基站的信息,其中包括基站id,location area code.mobile country code.mobile network code和信号强度,将这些数据发送到google的定位web服务里,就能拿到当前所在的位置信息,误差一般在

  • Android GPS定位测试(附效果图和示例)

    今天因为工作需要,把以前编写的一个GPS测试程序拿出来重新修改了一下.这个程序说起来有些历史了,是我11年编写的,那时候学了Android开发没多久,算是一个实验性的作品.现在工作需要,重新拿出来修整.同时发现我对android的GPS服务了解并不深,所以今天特意阅读了有关GPS服务的一些资料,把相关知识点记录下来. 本人做了GPS相关的嵌入式软件已经几年了,所以说起要做个测试GPS定位模块的程序,第一反应就是串口读取GPS模块的数据,然后解析GPS的NMEA格式数据.NMEA是一种标准化数据格

  • Android基站定位原理及实现代码

    复制代码 代码如下: import java.io.BufferedReader; import java.io.InputStreamReader; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org

  • Android实现地理定位功能

    最近试着写了一下Android的定位,代码在下面,比较简单 首先需要的权限有 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name=

随机推荐