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

在Android开发当中,经常需要用到定位功能,尤其是依赖于地理位置功能的应用,本文介绍了Android通过原生APi获取所在位置的经纬度,分享给大家

一、难点介绍

1.难点

我们的应用要新增一个功能,就是在用户打开附件的人页面后,将用户的经纬度通过一个接口返回给服务端,从而让服务器可以准确定位。

因为只是添加一个小功能所以,引入第三方SDK定位就有些大材小用了,所以就准备借助原生APi:LocationManager来完成。
经过在网络上一搜,有很多关于通过LocationManager获取经纬度坐标的,所有的代码几乎大同小异,本着负责任的态度,就看了好多篇,然后总结出了一个比较优良的获取经纬度的工具类。

在验证的过程中遇到了以下的几个问题:

①权限问题:Android 6.0之后新增动态权限,而获取获取经纬度坐标的权限如果你的app的(TargetVersion>=23)就需要动态获取了(当然也得在清单文件中设置)

②谷歌网络服务在中国被禁,所以就会导致网络定位在中国不可用, 只能使用GPS定位,而GPS定位需要用户打开GPS标志才能获取到

其中最让我难以解决的是第二个问题。因为尝试了很多次,只能通过打开GPS才能获取到位置。终于在问遍各位大神后,都说了关于是因为谷歌网络服务在中国被禁。

所幸,我们应用面对的群体是海外用户,所以不存在谷歌服务被墙的情况。

以上就是我在过程中遇到的问题了,如果解决了你的困惑的话,那就太开心了。

关于Android6.0动态权限的话,只要写好对应的回调就可以了,不算很难。

下面贴上我工具类的代码给大家:

public class LocationUtils {

  private volatile static LocationUtils uniqueInstance;
  private LocationManager locationManager;
  private String locationProvider;
  private Location location;
  private Context mContext;

  private LocationUtils(Context context) {
    mContext = context;
    getLocation();
  }

  //采用Double CheckLock(DCL)实现单例
  public static LocationUtils getInstance(Context context) {
    if (uniqueInstance == null) {
      synchronized (LocationUtils.class) {
        if (uniqueInstance == null) {
          uniqueInstance = new LocationUtils( context );
        }
      }
    }
    return uniqueInstance;
  }

  private void getLocation() {
    //1.获取位置管理器
    locationManager = (LocationManager) mContext.getSystemService( Context.LOCATION_SERVICE );
    //2.获取位置提供器,GPS或是NetWork
    List<String> providers = locationManager.getProviders( true );
    if (providers.contains( LocationManager.NETWORK_PROVIDER )) {
      //如果是网络定位
      Log.d( TAG, "如果是网络定位" );
      locationProvider = LocationManager.NETWORK_PROVIDER;
    } else if (providers.contains( LocationManager.GPS_PROVIDER )) {
      //如果是GPS定位
      Log.d( TAG, "如果是GPS定位" );
      locationProvider = LocationManager.GPS_PROVIDER;
    } else {
      Log.d( TAG, "没有可用的位置提供器" );
      return;
    }
    // 需要检查权限,否则编译报错,想抽取成方法都不行,还是会报错。只能这样重复 code 了。
    if (Build.VERSION.SDK_INT >= 23 &&
        ActivityCompat.checkSelfPermission( mContext, Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED &&
        ActivityCompat.checkSelfPermission( mContext, Manifest.permission.ACCESS_COARSE_LOCATION ) != PackageManager.PERMISSION_GRANTED) {
      return;
    }
    if (ActivityCompat.checkSelfPermission( mContext, Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission( mContext, Manifest.permission.ACCESS_COARSE_LOCATION ) != PackageManager.PERMISSION_GRANTED) {
      return;
    }
    //3.获取上次的位置,一般第一次运行,此值为null
    Location location = locationManager.getLastKnownLocation( locationProvider );
    if (location != null) {
      setLocation( location );
    }
    // 监视地理位置变化,第二个和第三个参数分别为更新的最短时间minTime和最短距离minDistace
    locationManager.requestLocationUpdates( locationProvider, 0, 0, locationListener );
  }

  private void setLocation(Location location) {
    this.location = location;
    String address = "纬度:" + location.getLatitude() + "经度:" + location.getLongitude();
    Log.d( TAG, address );
  }

  //获取经纬度
  public Location showLocation() {
    return location;
  }

  // 移除定位监听
  public void removeLocationUpdatesListener() {
    // 需要检查权限,否则编译不过
    if (Build.VERSION.SDK_INT >= 23 &&
        ActivityCompat.checkSelfPermission( mContext, Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED &&
        ActivityCompat.checkSelfPermission( mContext, Manifest.permission.ACCESS_COARSE_LOCATION ) != PackageManager.PERMISSION_GRANTED) {
      return;
    }
    if (locationManager != null) {
      uniqueInstance = null;
      locationManager.removeUpdates( locationListener );
    }
  }

  /**
  * LocationListern监听器
  * 参数:地理位置提供器、监听位置变化的时间间隔、位置变化的距离间隔、LocationListener监听器
  */

  LocationListener locationListener = new LocationListener() {

    /**
    * 当某个位置提供者的状态发生改变时
    */
    @Override
    public void onStatusChanged(String provider, int status, Bundle arg2) {

    }

    /**
    * 某个设备打开时
    */
    @Override
    public void onProviderEnabled(String provider) {

    }

    /**
    * 某个设备关闭时
    */
    @Override
    public void onProviderDisabled(String provider) {

    }

    /**
    * 手机位置发生变动
    */
    @Override
    public void onLocationChanged(Location location) {
      location.getAccuracy();//精确度
      setLocation( location );
    }
  };

}

用法:

public class MainActivity extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate( savedInstanceState );
    setContentView( R.layout.activity_main );
    Button btn = (Button) findViewById( R.id.btn );
    final TextView text = (TextView) findViewById( R.id.text );
    btn.setOnClickListener( new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        Location location = LocationUtils.getInstance( MainActivity.this ).showLocation();
        if (location != null) {
          String address = "纬度:" + location.getLatitude() + "经度:" + location.getLongitude();
          Log.d( "FLY.LocationUtils", address );
          text.setText( address );
        }

      }
    } );
  }

  @Override
  protected void onDestroy() {
    super.onDestroy();
    LocationUtils.getInstance( this ).removeLocationUpdatesListener();
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

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

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

  • 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 通过当前经纬度获得城市的实例代码

    复制代码 代码如下: 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如何获取经纬度

    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简单获取经纬度的方法

    本文实例讲述了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通过原生APi获取所在位置的经纬度

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

  • Android通过原生方式获取经纬度与城市信息的方法

    一.概述 在项目中需要获取用户所在位置的经纬度和城市上送给风控系统.一般来说,定位有两种方式: 用第三方SDK定位,如百度地图.高德地图.谷歌地图: 用Android原生SDK中的api定位: 本文讲述定位的第二种方式--用Android原生的SDK中的api定位,如果项目定位要求较高还是建议使用第三方地图库. 二.Android原生SDK中的api定位 Android原生方式获取经纬度两种定位方式:GPS定位和Wifi定位 GPS定位相比Wifi定位更精准且可在无网络情况下使用,但在室内基本暴

  • 利用百度地图API获取当前位置信息的实例

    利用百度地图API可以做很多事情,个人感觉最核心也是最基础的就是定位功能了.这里分享一个制作的JS可以实现登录网页后定位: <script type="text/javascript"> var map; var gpsPoint; var baiduPoint; var gpsAddress; var baiduAddress; var x; var y; function getLocation() { //根据IP获取城市 var myCity = new BMap.

  • android通过google api获取天气信息示例

    android通过google API获取天气信息 复制代码 代码如下: public class WeatherActivity extends Activity { private TextView txCity; private Button btnSearch; private Handler weatherhandler; private Dialog progressDialog; private Timer timer;    /** Called when the activit

  • python通过百度地图API获取某地址的经纬度详解

    前言 这几天比较空闲,就接触了下百度地图的API(开发者中心链接地址:http://developer.baidu.com),发现调用还是挺方便的,本文将给大家详细的介绍关于python通过百度地图API获取某地址的经纬度的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 申请百度API 1.打开网页 http://lbsyun.baidu.com/index.php?title=首页 选择功能与服务中的地图,点击左边的获取密匙,然后按照要求申请即可,需要手机和百度账号

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

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

  • 微信小程序API—获取定位的详解

    在微信小程序中,我们可以很方便的通过API接口来获取我们当前的位置,接下来我讲告诉大家微信获取定位的API-wx.getLocation的用法,以及我们通过获取定位,得到当地的位置,天气等信息. <view class='content'> <view class='today'> <view class='info'> <view class='temp'>{{weather.temperature.data}}℃</view> <vie

  • JavaScript 获取滚动条位置并将页面滑动到锚点

    前言 这篇来记录下最近工作中遇到的一个问题,在app原生和前端h5混合开发的过程中,其中一个页面是选择城市列表的页面,类似于美团饿了么城市选择,银行app中银行列表选择,通讯录中快速定位到联系人选择的锚点位置等这样的功能,作为刚入门不久的我来说,感觉这个功能还是有一点压力.下面我来分享一下我所查到的一些实现方法. 什么是锚点问题 对于pc端网页来说,常见的网页右侧的回到顶部按钮,点击直接跳转到网页最上面,就是锚点的实现: 对于移动端来说,打开你手机的通讯录,点击右侧的字母,页面直接跳转到对应字母

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

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

随机推荐