热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

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

这篇文章主要给大家介绍了关于Android通过原生方式获取经纬度与城市信息的相关资料,文中通过示例代码介绍的非常详细,对各位Android开发者们具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

一、概述

在项目中需要获取用户所在位置的经纬度和城市上送给风控系统。一般来说,定位有两种方式:

  1. 用第三方SDK定位,如百度地图、高德地图、谷歌地图;
  2. 用Android原生SDK中的api定位;

本文讲述定位的第二种方式--用Android原生的SDK中的api定位,如果项目定位要求较高还是建议使用第三方地图库。

二、Android原生SDK中的api定位

Android原生方式获取经纬度两种定位方式:GPS定位和Wifi定位

  • GPS定位相比Wifi定位更精准且可在无网络情况下使用,但在室内基本暴毙无法使用。
  • WiFi定位没有室内外限制,也不需要开启GPS但需要联网。但测试发现WiFi定位时onLocationChanged函数(用于监听经纬度变化)触发间隔无法小于30s。

示例代码如下:

public class TestLocationActivity extends AppCompatActivity {

 public static final int LOCATION_CODE = 301;
 private LocationManager locationManager;
 private String locatiOnProvider= null;


 @Override
 protected void onCreate(@Nullable Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  getLocation();
 }

 private void getLocation(){
  //1.获取位置管理器
  locatiOnManager= (LocationManager) getSystemService(Context.LOCATION_SERVICE);

  //2.获取位置提供器,GPS或是NetWork
  List providers = locationManager.getProviders(true);

  if (providers.contains(LocationManager.GPS_PROVIDER)) {
   //如果是GPS
   locatiOnProvider= LocationManager.GPS_PROVIDER;
   Log.v("TAG", "定位方式GPS");
  } else if (providers.contains(LocationManager.NETWORK_PROVIDER)) {
   //如果是Network
   locatiOnProvider= LocationManager.NETWORK_PROVIDER;
   Log.v("TAG", "定位方式Network");
  }else {
   Toast.makeText(this, "没有可用的位置提供器", Toast.LENGTH_SHORT).show();
   return;
  }

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
   //获取权限(如果没有开启权限,会弹出对话框,询问是否开启权限)
   if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) 
     != PackageManager.PERMISSION_GRANTED || 
    ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) 
     != PackageManager.PERMISSION_GRANTED) {
    //请求权限
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION,
      Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_CODE);
   } else {
    //3.获取上次的位置,一般第一次运行,此值为null
    Location location = locationManager.getLastKnownLocation(locationProvider);
    if (location!=null){
     Toast.makeText(this, location.getLongitude() + " " + 
           location.getLatitude() + "",Toast.LENGTH_SHORT).show();
     Log.v("TAG", "获取上次的位置-经纬度:"+location.getLongitude()+" "+location.getLatitude());
     getAddress(location);

    }else{
     //监视地理位置变化,第二个和第三个参数分别为更新的最短时间minTime和最短距离minDistace
     locationManager.requestLocationUpdates(locationProvider, 3000, 1,locationListener);
    }
   }
  } else {
   Location location = locationManager.getLastKnownLocation(locationProvider);
   if (location!=null){
    Toast.makeText(this, location.getLongitude() + " " + 
          location.getLatitude() + "", Toast.LENGTH_SHORT).show();
    Log.v("TAG", "获取上次的位置-经纬度:"+location.getLongitude()+" "+location.getLatitude());
    getAddress(location);

   }else{
    //监视地理位置变化,第二个和第三个参数分别为更新的最短时间minTime和最短距离minDistace
    locationManager.requestLocationUpdates(locationProvider, 3000, 1,locationListener);
   }
  }
 }

 public LocationListener locatiOnListener= new LocationListener() {
  // Provider的状态在可用、暂时不可用和无服务三个状态直接切换时触发此函数
  @Override
  public void onStatusChanged(String provider, int status, Bundle extras) {
  }
  // Provider被enable时触发此函数,比如GPS被打开
  @Override
  public void onProviderEnabled(String provider) {
  }
  // Provider被disable时触发此函数,比如GPS被关闭
  @Override
  public void onProviderDisabled(String provider) {
  }
  //当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发
  @Override
  public void onLocationChanged(Location location) {
   if (location != null) {
    //如果位置发生变化,重新显示地理位置经纬度
    Toast.makeText(TestLocationActivity.this, location.getLongitude() + " " + 
               location.getLatitude() + "", Toast.LENGTH_SHORT).show();
    Log.v("TAG", "监视地理位置变化-经纬度:"+location.getLongitude()+" "+location.getLatitude());
   }
  }
 };

 @Override
 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
  switch (requestCode) {
   case LOCATION_CODE:
    if(grantResults.length > 0 && grantResults[0] == getPackageManager().PERMISSION_GRANTED
      && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
     Toast.makeText(this, "申请权限", Toast.LENGTH_LONG).show();
     try {
      List providers = locationManager.getProviders(true);
      if (providers.contains(LocationManager.NETWORK_PROVIDER)) {
       //如果是Network
       locatiOnProvider= LocationManager.NETWORK_PROVIDER;

      }else if (providers.contains(LocationManager.GPS_PROVIDER)) {
       //如果是GPS
       locatiOnProvider= LocationManager.GPS_PROVIDER;
      }
      Location location = locationManager.getLastKnownLocation(locationProvider);
      if (location!=null){
       Toast.makeText(this, location.getLongitude() + " " + 
             location.getLatitude() + "", Toast.LENGTH_SHORT).show();
       Log.v("TAG", "获取上次的位置-经纬度:"+location.getLongitude()+" "+location.getLatitude());
      }else{
       // 监视地理位置变化,第二个和第三个参数分别为更新的最短时间minTime和最短距离minDistace
       locationManager.requestLocationUpdates(locationProvider, 0, 0,locationListener);
      }

     }catch (SecurityException e){
      e.printStackTrace();
     }
    } else {
     Toast.makeText(this, "缺少权限", Toast.LENGTH_LONG).show();
     finish();
    }
    break;
  }
 }


 //获取地址信息:城市、街道等信息
 private List
getAddress(Location location) { List
result = null; try { if (location != null) { Geocoder gc = new Geocoder(this, Locale.getDefault()); result = gc.getFromLocation(location.getLatitude(), location.getLongitude(), 1); Toast.makeText(this, "获取地址信息:"+result.toString(), Toast.LENGTH_LONG).show(); Log.v("TAG", "获取地址信息:"+result.toString()); } } catch (Exception e) { e.printStackTrace(); } return result; } @Override protected void onDestroy() { super.onDestroy(); locationManager.removeUpdates(locationListener); } }

在AndroidManifest.xml加权限


 


三、总结

首先将手机定位服务设置,调到下图所示:

这可能会获取不到经纬度。为什么在网络和GPS都可用的情况下只执行GPS而不是网络?也许是从精确度考虑的,但是走GPS进入监听的listener后,不会执行onLocationChanged()方法,因为我是在室内,没有移动,所以如果你获取不到经纬度,就要将定位服务调到仅使用网络定位或者关闭手机GPS这样就可以获取到了。

总结

到此这篇关于Android通过原生方式获取经纬度与城市信息的文章就介绍到这了,更多相关Android原生获取经纬度与城市信息内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 解决微信电脑版无法刷朋友圈问题:使用安卓远程投屏方案
    在工作期间想要浏览微信和朋友圈却不太方便?虽然微信电脑版目前不支持直接刷朋友圈,但通过远程投屏技术,可以轻松实现在电脑上操作安卓设备的功能。 ... [详细]
  • 在维护公司项目时,发现按下手机的某个物理按键后会激活相应的服务,并在屏幕上模拟点击特定坐标点。本文详细介绍了如何使用ADB Shell Input命令来模拟各种输入事件,包括滑动、按键和点击等。 ... [详细]
  • 本文详细介绍了 Java 中 org.apache.xmlbeans.SchemaType 类的 getBaseEnumType() 方法,提供了多个代码示例,并解释了其在不同场景下的使用方法。 ... [详细]
  • 本文深入探讨了 com.example.android.sunshine.data.TestUtilities 中 validateThenCloseCursor() 方法的使用方法及其代码示例,旨在帮助开发者更好地理解和应用该方法。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 本文详细记录了在银河麒麟操作系统和龙芯架构上使用 Qt 5.15.2 进行项目打包时遇到的问题及解决方案,特别关注于 linuxdeployqt 工具的应用。 ... [详细]
author-avatar
mobiledu2502877527
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有