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软件编程有所帮助。

(0)

相关推荐

  • 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获取经纬度计算距离介绍

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

  • 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和基站的经纬度地址实现代码

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

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

  • 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获取当前位置的经纬度数据

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

  • Android通过原生APi获取所在位置的经纬度

    在Android开发当中,经常需要用到定位功能,尤其是依赖于地理位置功能的应用,本文介绍了Android通过原生APi获取所在位置的经纬度,分享给大家 一.难点介绍 1.难点 我们的应用要新增一个功能,就是在用户打开附件的人页面后,将用户的经纬度通过一个接口返回给服务端,从而让服务器可以准确定位. 因为只是添加一个小功能所以,引入第三方SDK定位就有些大材小用了,所以就准备借助原生APi:LocationManager来完成. 经过在网络上一搜,有很多关于通过LocationManager获取经

  • Android获取手机位置的实现代码

    本文实例为大家分享了Android获取手机位置的方法,供大家参考,具体内容如下 1.项目Src下创建...service包,然后新建GPSService类 package com.zebra.mobilesafe.service; import java.io.IOException; import java.io.InputStream; import android.app.Service; import android.content.Intent; import android.cont

  • 微信小程序之获取当前位置经纬度以及地图显示详解

    最近刚开始接触微信小程序,在弄懂其结构以及相关接口之后,准备着手实现一个小程序,功能包括--获取用户当前位置的经纬度,在地图上查看位置,通过地图获取不同位置的经纬度. 微信小程序的主体部分包括: 新增页面需要在app.json进行配置: "pages":[ "pages/index/index", "pages/location/location", "pages/logs/logs" ] 通过在视图层调用bindtap与逻辑

  • 微信小程序获取当前位置和城市名

    1, 获取当前地理位置,首先要拿到用户的授权wx.openSetting: 2,微信的getLocation接口,获取当前用户的地理位置(微信返回的是经纬度,速度等参数): 3,微信没有将经纬度直接转换为地理位置,借用腾讯位置服务中关于微信小程序的地理转换JS SDK 的API(返回信息中包括国家,省,市,区,经纬度等地理位置) 步骤描述清楚以后,下面就开始按步骤操作了:(本文仅仅讲述如何获取用户地理位置的授权) 图示为获取用户地理位置授权弹窗 在用户首次进入某页面(需要地理位置授权)时候,在页

  • 在微信小程序中获取用户位置的详细过程

    目录 前言 wx.getLocation 腾讯位置服务 总结 前言 最近在学习微信小程序,在学习的过程中,有很多好玩的 API,经常点外卖的同学可能在小程序中遇到过,比如:某团.某了么都是有显示当前用户位置信息的,那么今天给大家介绍如何获取当前用户位置信息,听上去很不错,其实实践起来也不是很难. wx.getLocation 首先,我们需要来认识一下 wx.getLocation 这个 API 方法,我们先看看 微信官方文档 中是怎么说的 看我划红线的地方就可以了,文档中明确的表示这个 API

  • Android实现Service获取当前位置(GPS+基站)的方法

    本文实例讲述了Android实现Service获取当前位置(GPS+基站)的方法.分享给大家供大家参考.具体如下: 需求详情: 1).Service中每隔1秒执行一次定位操作(GPS+基站) 2).定位的结果实时显示在界面上(要求得到经度.纬度) 技术支持: 1).获取经纬度 通过GPS+基站获取经纬度,先通过GPS来获取,如果为空改用基站进行获取–>GPS+基站(基站获取支持联通.电信.移动). 2).实时获取经纬度 为了达到实时获取经纬度,需在后台启动获取经纬度的Service,然后把经纬度

  • 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 Studio中使用BaiduMap SDK实时获取当地位置信息

    配置BaiduMap 环境 1.在百度API中新建自己的一个APP包名和APP名需要注意和自己Android Studio 中的包名和APP名保持一致: 2.百度地图中还需要填写一个SHA1 数字签名: a.输入keytool -list -v -keystore debug.keystore,会得到三种指纹证书,选取SHA1类型的证书(密钥口令是android),这个获取到的SHA1的值和ecplise中获取的值是一样的,是作为debug用的. b.输入keytool -list -v -ke

  • Android获取位置信息的方法

    本文实例为大家分享了Android获取位置信息的具体代码,供大家参考,具体内容如下 1.位置服务的简介:位置服务,英文翻译为Location-Based Services,缩写为LBS,又称为定位服务或基于位置的服务,融合了GPS定位.移动通信.导航等多种技术,提供与空间位置相关的综合应用服务,基于位置的服务发展很迅速,涉及商务.医疗.工作和生活的各个方面,为用户提供定位.追踪和敏感区域警告等一系列服务.比如谷歌地图,百度地图,都需要通过位置服务. 2.Android平台下支持提供位置服务的AP

随机推荐