Android获取当前位置的经纬度数据

现在有这么一个需求:开启一个Service服务,获取当前位置的经纬度数据,将获取的数据以广播的方式发送出去,注册广播的Activity接收广播信息,并将接收到的数据在当前Activity显示,如果当前位置发生变化,经纬度数据改变,获取改变后的经纬度数据,通过Handler发送消息,更新UI界面,显示更新后的内容,请问这样子的Demo该如何实现?

LocationTool获取当前位置信息

Android手机获取当前位置的方式:GPS定位,WIFI定位,基站定位,当前Demo使用GPS卫星定位,在LocationTool中返回Location、LocationManager两者对象,通过Location提供的getLatitude()、getLongitude()读取经纬度数据,同时添加位置改变监听器MyLocationListener,具体代码如下:

package cn.teachcourse.utils; 

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.provider.Settings;
import android.widget.Toast; 

/*
 @author postmaster@teachcourse.cn
 @date 创建于:2016-1-22
 */
public class LocationTool {
  public Location getLocation() {
    return mLocation;
  } 

  public void setLocation(Location location) {
    this.mLocation = location;
  } 

  private Context context;
  private Location mLocation;
  private LocationManager mLocationManager; 

  public LocationTool(Context context) {
    super(); 

    mLocationManager = (LocationManager) context
        .getSystemService(Context.LOCATION_SERVICE);
    mLocation = mLocationManager.getLastKnownLocation(getProvider()); 

    mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
        2000, 10, new MyLocationListener(this));
  } 

  // 获取Location Provider
  private String getProvider() {
    // 构建位置查询条件
    Criteria criteria = new Criteria();
    // 查询精度:高
    criteria.setAccuracy(Criteria.ACCURACY_FINE);
    // 是否查询海拨:否
    criteria.setAltitudeRequired(false);
    // 是否查询方位角 : 否
    criteria.setBearingRequired(false);
    // 是否允许付费:是
    criteria.setCostAllowed(true);
    // 电量要求:低
    criteria.setPowerRequirement(Criteria.POWER_LOW);
    // 返回最合适的符合条件的provider,第2个参数为true说明 , 如果只有一个provider是有效的,则返回当前provider
    return mLocationManager.getBestProvider(criteria, true);
  } 

  public LocationManager getLocationManager() { 

    return mLocationManager;
  } 

  private LocationListener mLocationListener = new LocationListener() { 

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
      // TODO Auto-generated method stub 

    } 

    @Override
    public void onProviderEnabled(String provider) {
      Location l = mLocationManager.getLastKnownLocation(provider); 

      if (l != null) {
        mLocation = l;
      } 

    } 

    @Override
    public void onProviderDisabled(String provider) {
      mLocation = null;
    } 

    @Override
    public void onLocationChanged(Location location) {
      if (location != null) {
        mLocation = location;
      } 

    }
  }; 

  public void closeLocation() {
    if (mLocationManager != null) {
      if (mLocationManager != null) {
        mLocationManager.removeUpdates(mLocationListener);
        mLocationListener = null;
      }
      mLocationManager = null;
    }
  }
}

MyLocationListener位置改变监听器

LocationManager对象调用requestLocationUpdates(String provider, long minTime, float minDistance,LocationListener listener),在回调的方法中获取改变后的Location对象,其中provider表示LocationManager.GPS_PROVIDER,minTime表示最短时间间隔内更新位置信息(单位毫秒),minDistance表示最短距离内更新位置信息(单位米),MyLocationListener继承LocationListener,需要重写的方法如下:

package cn.teachcourse.utils; 

import android.location.Location;
import android.location.LocationListener;
import android.os.Bundle; 

/*
 @author postmaster@teachcourse.cn
 @date 创建于:2016-1-22
 */ 

public class MyLocationListener implements LocationListener { 

  private LocationTool gpsTool; 

  /**构造方法,传入LocationTool
   * @param gpsTool
   */
  public MyLocationListener(LocationTool gpsTool) {
    super();
    this.gpsTool = gpsTool;
  } 

  /**
   * 当前位置改变后,回调onLocationChanged方法,获取改变后的Location对象
   *
   */
  @Override
  public void onLocationChanged(Location location) {
    if (location != null) {
      gpsTool.setLocation(location);
    } 

  } 

  /**
   * 当provider状态改变时回调的方法,当前的provider无法读取位置信息或者provider从无法读取位置信息变为能够读取为信息被回调的方法
   *
   */
  @Override
  public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub 

  } 

  /**
   * 当provider被用户允许开启,回调的onProviderEnabled方法,比如:开启定位功能,回调该方法
   *
   */
  @Override
  public void onProviderEnabled(String provider) {
    Location l = gpsTool.getLocationManager()
        .getLastKnownLocation(provider); 

    if (l != null) {
      gpsTool.setLocation(l);
    } 

  } 

  /**
   * 当provider不被用户允许开启,回调的onProviderDisabled方法,比如:无法开启定位功能,回调该方法
   *
   */
  @Override
  public void onProviderDisabled(String provider) {
    gpsTool.setLocation(null); 

  } 

}

LocationService服务读取位置信息

为什么要开启Service呢?Service和Activity、Fragment一样也有自己的生命周期,onCreate——>onStartCommand(onStart)——>onUnbind——>onRebind——>onDestroy,在LocationService执行的操作是启动一个线程获取更新后的位置信息,并以广播的方式发送出去,具体代码如下:

package cn.teachcourse.utils; 

import android.app.Activity;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationManager;
import android.os.IBinder;
import android.provider.Settings;
import android.widget.Toast; 

/*
 @author postmaster@teachcourse.cn
 @date 创建于:2016-1-22
 */
public class LocationService extends Service {
  private LocationTool mGPSTool = null;
  private boolean threadDisable = false;
  private final static String TAG = LocationService.class.getSimpleName(); 

  @Override
  public void onCreate() {
    // TODO Auto-generated method stub
    super.onCreate();
    mGPSTool = new LocationTool(this);
    startThread();
  } 

  private void startThread() {
    new Thread(new Runnable() {
      @Override
      public void run() {
        while (!threadDisable) {
          try {
            Thread.sleep(1000);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
          if (mGPSTool != null) { // 当结束服务时gps为空
            // 获取经纬度
            Location location = mGPSTool.getLocation(); 

            // 发送广播
            Intent intent = new Intent();
            intent.putExtra("lat",
                location == null ? "" : location.getLatitude()
                    + "");
            intent.putExtra("lon",
                location == null ? "" : location.getLongitude()
                    + "");
            intent.setAction("cn.teachcourse.utils.GPSService"); 

            sendBroadcast(intent);
          } 

        }
      }
    }).start();
  } 

  @Override
  public void onDestroy() {
    super.onDestroy();
    threadDisable = true;
    if (mGPSTool != null) {
      mGPSTool.closeLocation();
      mGPSTool = null;
    }
  } 

  @Override
  public IBinder onBind(Intent intent) { 

    return null;
  } 

}

MainActivity启动服务、注册广播、显示位置信息

在MainActivity需要做的事情有:第一启动LocationService服务,调用startService()方法;第二注册广播接收器(BroadcastReceiver),创建了一个内部类MyBroadcastReceiver,继承BroadcastReceiver,重写onReceive方法;第三获取经纬度数据,更新UI界面,显示当前位置信息,具体代码如下:

//启动服务
startService(new Intent(this, LocationService.class));
//注册广播
private class MyReceiver extends BroadcastReceiver { 

    @Override
    public void onReceive(Context context, Intent intent) {
      Bundle bundle = intent.getExtras();
      String lon = bundle.getString("lon");
      String lat = bundle.getString("lat");
      if (!TextUtils.isEmpty(lon) && !TextUtils.isEmpty(lat)) {
        mLatitude = lat;
        mLongitude = lon;
        isObtainLoc = true; 

        new Thread(new Runnable() { 

          @Override
          public void run() {
            Message msg = new Message();
            msg.what = REFRESH_UI;// 发送消息,通知刷新界面
            mHandler.sendMessage(msg);
          }
        }).start();
      }
    } 

  } 

//更新UI界面
private Handler mHandler = new Handler() { 

    @Override
    public void handleMessage(Message msg) {
      // TODO Auto-generated method stub
      super.handleMessage(msg);
      switch (msg.what) {
      case REFRESH_UI: 

        reFreshUI(); 

        break;
      default:
        break;
      }
    }
  }; 

  private void reFreshUI() {
    if (isObtainLoc) {
      mTextView.setText("目前经纬度\n经度:" + mLongitude + "\n纬度:" + mLatitude);
      mDialog.dismiss();
    } 

  }

以上就是本文的全部内容,希望对大家学习Android软件编程有所帮助。

时间: 2016-02-12

android如何获取经纬度

android 定位的两种方式:GPS_PROVIDER and NETWORK_PROVIDER 定位的可以借助LocationManager来实现 MainActivity代码 static final String TAG = "MainActivity"; private TextView locationTV; private LocationManager locationManager; private String provider; ArrayList<Cont

Android 通过当前经纬度获得城市的实例代码

复制代码 代码如下: package com.yy; import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL; import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes;import org.xml.sax.InputSou

Android获取经纬度计算距离介绍

经度指示南北方向,纵向纬度指示东西方向,横向 获取经纬度 使用GPS权限: 复制代码 代码如下: <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> Android提供LocationManager和Location,可以方便的获得经纬度.海拔等位置.使用LocationManager来获得位置管理类,从而可以获得历史GPS信息以及位

android手机获取gps和基站的经纬度地址实现代码

复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" an

Android简单获取经纬度的方法

本文实例讲述了Android简单获取经纬度的方法.分享给大家供大家参考,具体如下: public void getLoc() { // 位置 LocationManager locationManager; LocationListener locationListener; Location location; String contextService = Context.LOCATION_SERVICE; String provider; double lat; double lon; l

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编程实现根据经纬度查询地址并对获取的json数据进行解析的方法

本文实例讲述了Android编程实现根据经纬度查询地址并对获取的json数据进行解析的方法.分享给大家供大家参考,具体如下: 第一步:根据指定的URL从google 服务器上获得包含地址的json格式的数据(其还提供xml格式的,但json解析效率比xml高) private static StringBuffer getJSONData(String urlPath){ try { URL url = new URL(urlPath); HttpURLConnection httpURLCon

Android Studio获取网络JSON数据并处理的方法

本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 1.需要的网络JSON数据 2.数据实现类 package chenglong.activitytest.pengintohospital.entity; import org.json.JSONException; import org.json.JSONObject; /** * * 科室 * Created by LICHENGLONG on 2017-10-02. */ public class Bas

Python调用百度根据经纬度查询地址的示例代码

如下所示: def locatebyLatLng(lat, lng, pois=0): ''' 根据经纬度查询地址 ''' items = {'location': str(lat) + ',' + str(lng), 'ak': '你自己申请的百度ak', 'output': 'json'} res = requests.get('http://api.map.baidu.com/geocoder/v2/', params=items) result = res.json() print(re

Android WebView交互传递json字符串并解析的方法

前言 我们大家都知道WebView交互中可以传递基本数据类型的数据值,比如常用的int,String. 但是WebView也可以传递一种很重要很常用的数据格式-json数据. 传递json和传递String数据是一样的,关键就是HTML5端对json数据通过eval()函数进行解析 传递过程中android端调用的最重要的一个函数就是: addJavascriptInterface(new MyObject(this,"dd"),"my"); 这个函数有两个参数,第

android客户端从服务器端获取json数据并解析的实现代码

首先客户端从服务器端获取json数据 1.利用HttpUrlConnection 复制代码 代码如下: /**      * 从指定的URL中获取数组      * @param urlPath      * @return      * @throws Exception      */     public static String readParse(String urlPath) throws Exception {                  ByteArrayOutputSt

Android中使用Gson解析JSON数据的两种方法

Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率. 从结构上看,所有的数据(data)最终都可以分解成三种类型: 第一种类型是标量(scalar),也就是一个单独的字符串(string)或数字(numbers),比如"北京"这个单独的词. 第二种类型是序列(sequence),也就是若干个相关的数据按照一定顺序并列在一起,又叫做数组(array)或列表(List),比如"北京,上海". 第三种类型是映射(mapping),也就是一个名/值对(

Android编程简单解析JSON格式数据的方法示例

本文实例讲述了Android编程简单解析JSON格式数据的方法.分享给大家供大家参考,具体如下: 比起XML,JSON主要优势在于它的体积更小,在网络上传输的时候可以更省流量.但缺点在于,它的语义性较差,显示不如XML直观. JSON格式 : { "name_A" : "value_A","name_B" : "value_B" } 表示: name_A = value_A; name_B = value_B; 我将对下面的J

Android系列---JSON数据解析的实例

上篇随笔详细介绍了三种解析服务器端传过来的xml数据格式,而对于服务器端来说,返回给客户端的数据格式一般分为html.xml和json这三种格式,那么本篇随笔将讲解一下json这个知识点,包括如何通过json-lib和gson这两个json解析库来对解析我们的json数据,以及如何在我们的Android客户端解析来自服务器端的json数据,并更新到UI当中. 一.什么是json json(Javascript Object Notation)是一种轻量级的数据交换格式,相比于xml这种数据交换格

Android随手笔记44之JSON数据解析

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种理想的数据交换格式. 本文将主要介绍在Android开发中,如何在服务器端创建JSON数据,以及如何在Android客户端对JSON数据进行解析. 1.JSON数据结构 在JSON中有两种数据结构:对象和数组. 1.1对象 在JSON中,一个对象以"{"(左括号)开始,"}"(右括号)结束.每个"名称"

Android编程实现号码归属地查询的方法

本文实例讲述了Android编程实现号码归属地查询的方法.分享给大家供大家参考,具体如下: 我们通过发送XML访问 WebService就可以实现号码的归属地查询,我们可以使用代理服务器提供的XML的格式进行设置,然后请求提交给服务器,服务器根据请求就会返回给一个XML,XML中就封装了我们想要获取的数据. 发送XML 1.通过URL封装路径打开一个HttpURLConnection 2.设置请求方式,Content-Type和Content-Length XML文件的Content-Type为