前言:花了一个早上研究了以下android获取经纬度,然后网上的参考资料都是杂七杂八,基本上都是过去几年的,现在我用 android6.0参照别人的结果发生好多错误,我的内心几乎是崩溃的。后来,不断百度,不断goole,不断查找资料,终于解决了,而且完美打包,以后直接用就可以了。

  1.这个类原来是用kotlin写的,后来有些东西和java又不同,索性就改成java吧,反正他们兼容性很强-----封装的类名为:LocationUtil

package com.example.jason_jan.guangdamiao.Util;import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.content.ContextCompat;
import android.widget.Toast;import com.example.jason_jan.guangdamiao.GlobalConstant.LogUtils;import java.io.IOException;
import java.util.List;/*** Created by Jason_Jan on 2017/7/14.*/public class LocationUtil {// 纬度public static double latitude = 0.0;// 经度public static double longitude = 0.0;public static LocationManager locationManager;public static Location location;private static String provider;/*** 初始化位置信息** @param context*/public static void initLocation(Context context) {LocationListener locationListener = new LocationListener() {@Overridepublic void onStatusChanged(String arg0, int arg1, Bundle arg2) {// TODO Auto-generated method stub}@Overridepublic void onProviderEnabled(String arg0) {// TODO Auto-generated method stub}@Overridepublic void onProviderDisabled(String arg0) {// TODO Auto-generated method stub}@Overridepublic void onLocationChanged(Location arg0) {// TODO Auto-generated method stub// 更新当前经纬度}};//获取定位服务locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);//获取当前可用的位置控制器List<String> list = locationManager.getProviders(true);if (list.contains(LocationManager.GPS_PROVIDER)) {//是否为GPS位置控制器provider = LocationManager.GPS_PROVIDER;}else if (list.contains(LocationManager.NETWORK_PROVIDER)) {//是否为网络位置控制器provider = LocationManager.NETWORK_PROVIDER;} else {Toast.makeText(context, "请检查网络或GPS是否打开",Toast.LENGTH_LONG).show();return;}if ( Build.VERSION.SDK_INT >= 23 &&ContextCompat.checkSelfPermission( context, android.Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED &&ContextCompat.checkSelfPermission( context, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {return  ;}location = locationManager.getLastKnownLocation(provider);if (location != null) {//获取当前位置,这里只用到了经纬度String stringPosition = "纬度为:" + location.getLatitude() + ",经度为:"+ location.getLongitude();longitude=location.getLongitude();latitude=location.getLatitude();Toast.makeText(context, stringPosition, Toast.LENGTH_LONG).show();}//绑定定位事件,监听位置是否改变//第一个参数为控制器类型第二个参数为监听位置变化的时间间隔(单位:毫秒)//第三个参数为位置变化的间隔(单位:米)第四个参数为位置监听器locationManager.requestLocationUpdates(provider, 2000, 2, locationListener);}public static String getAddress(Location location,Context context) throws IOException {if(location==null){LogUtils.INSTANCE.d_debugprint("错误","未找到location");return "";}Geocoder geocoder = new Geocoder(context);boolean flag = geocoder.isPresent();LogUtils.INSTANCE.d_debugprint("位置信息","the flag is "+flag);StringBuilder stringBuilder = new StringBuilder();try {//根据经纬度获取地理位置信息List<Address> addresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1);LogUtils.INSTANCE.d_debugprint("经度",Double.toString(location.getLatitude()));LogUtils.INSTANCE.d_debugprint("纬度",Double.toString(location.getLongitude()));//根据地址获取地理位置信息//List<Address> addresses = geocoder.getFromLocationName( "广东省珠海市香洲区沿河路321号", 1);if (addresses.size() > 0) {Address address = addresses.get(0);for (int i = 0; i < address.getMaxAddressLineIndex(); i++) {stringBuilder.append(address.getAddressLine(i)).append("\n");}stringBuilder.append(address.getCountryName()).append("_");//国家stringBuilder.append(address.getFeatureName()).append("_");//周边地址stringBuilder.append(address.getLocality()).append("_");//市stringBuilder.append(address.getPostalCode()).append("_");stringBuilder.append(address.getCountryCode()).append("_");//国家编码stringBuilder.append(address.getAdminArea()).append("_");//省份stringBuilder.append(address.getSubAdminArea()).append("_");stringBuilder.append(address.getThoroughfare()).append("_");//道路stringBuilder.append(address.getSubLocality()).append("_");//香洲区stringBuilder.append(address.getLatitude()).append("_");//经度stringBuilder.append(address.getLongitude());//维度/*System.out.println(stringBuilder.toString());*/LogUtils.INSTANCE.d_debugprint("获取到的地理位置为:",stringBuilder.toString());}} catch (IOException e) {// TODO Auto-generated catch blockToast.makeText(context, "报错", Toast.LENGTH_LONG).show();e.printStackTrace();}return stringBuilder.toString();}
}

  

2.简单解释以上的代码吧

  -----5个静态变量,都很重要。LocationManager是老大。经度纬度是我们需要的东西。

  -----初始化位置信息,在用的时候,先就初始化一下就ok了。

  -----里面一个监听位置信息,不用管,直接照抄。

  -----后面是从LocationManager那里得到位置服务。

  -----最后一个是绑定位置时间,监听位置是否改变。

  -----值得注意的是,有一个版本判断,不写的话,有tm来一些版本不同,然后怎么怎么样,烦死了,这个先加上,作用也不知道有没有,不过后面用的时候还要注意一些权限问题,我在后面提一下。

  3.然后就是一个静态方法,getAddress来通过经度纬度,来获取我们需要的位置信息。直接复制就行。不过有一个日志打印的东西,直接删掉就好。就是这个东西-----LogUtils.INSTANCE.d_debugprint()。这个东西是我封装好来打印堆栈信息在多少行在哪个函数,而且只在调试的时候有效。后面有时间我会写这方面的博客的。

  4.调用的时候就比较轻松了。注意这里调用的话,因为服务在后台运行,要用一个线程处理查找地理位置的函数,因为主线程是很忙的,动不动就崩溃了。

  

  if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {  requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_PERMISSION_LOCATION);} else {LocationUtil.initLocation(this);LogUtils.INSTANCE.d_debugprint("经度:",Double.toString(LocationUtil.longitude));LogUtils.INSTANCE.d_debugprint("纬度:",Double.toString(LocationUtil.latitude));}

  对于上面的if,非常重要,我一早上就在找这方面的东西,就这么解决就好,不过这样还是会报错=====

@TargetApi(Build.VERSION_CODES.M)@Overrideprotected void onCreate(Bundle savedInstanceState)  {。。。}加一个@TargetApi(Build.VERSION_CODES.M)这样就没事了。

  5.线程呢,线程呢?不要急,在下面=====  
 new Thread(new Runnable() {@Overridepublic void run() {try {str_location= LocationUtil.getAddress(LocationUtil.location,getApplicationContext());//位置信息-----一个字符串}catch (IOException e){e.printStackTrace();}handler_location.post(new Runnable() {@Overridepublic void run() {Toast.makeText(getApplicationContext(),str_location,Toast.LENGTH_LONG).show();}});}}).start();

  6.就是这样用,很方便吧。注意还有在=====AndroidManifest.xml中加必要的权限
<!--获取当前地理位置要的权限--><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 仅网络定位的权限 --><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!--网络访问的权限--> <uses-permission android:name="android.permission.INTERNET" />

    这个东西也是十分坑人的。注意加上。

  7.That's all.继续干!!!

 

  

转载于:https://www.cnblogs.com/Jason-Jan/p/7170356.html

Android 获取地理位置信息 封装好了 直接用相关推荐

  1. 【Android笔记 二】Location获取地理位置信息(上)

    2011 7 22暑假实训的第五天,跟大家分享以下我对Android location的学习吧,这是一个最基本的获取地理位置信息的入门,下一次给大家介绍更质能化的地理位置选择Criteria,今天就先 ...

  2. flutter利用高德如何获取地理位置信息bug处理

    flutter中对于利用高德如何获取地理位置信息, 1.在高德开发平台,注册成为开发者,并获取key 2.安装依赖 对于如何安装第三方插件 请点击此处pub.dev amap_location 3.修 ...

  3. html5实现获取地理位置信息并定位

    html5实现获取地理位置信息并定位 一.总结 一句话总结:获取地理位置是分两步:获取经纬度和根据经纬度获取地址信息 a.HTML5的Geolocation(地理位置功能(Geolocation AP ...

  4. 百度api:根据经纬度获取地理位置信息

    调用百度api,根据经度和纬度获取地理位置信息,返回Json. C#代码: using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Syste ...

  5. html5获取地理位置信息API

    html5获取地理位置信息API 在HTML5中,可以看下如何使用Geolocation API来获得用户的地理位置信息,如果该浏览器支持的话,且设备具有定位功能,就能够直接使用这组API来获取当前位 ...

  6. I.MX6 android 获取framebuffer信息

    /********************************************************************************* I.MX6 android 获取f ...

  7. 微信小程序获取地理位置信息

    // pages/list/list.js Page({/*** 页面的初始数据*/data: {nation: '',province: '',city: '',district: '',stree ...

  8. uniapp APPH5端获取地理位置信息(百度地图高德地图)

    APP&H5端获取地理位置信息 一.app端 1.在需要使用的页面中 onShow(){//#ifdef APP-PLUS// 获取定位信息this.getLocations();//#end ...

  9. android获取电池信息;android获取电池容量、技术、电压、电量、温度等信息

    android获取电池信息:android获取电池容量.技术.电压.电量.温度等信息 1.这里我仅展示工具类,需要注意的是这里的部分值要刷新后才能显示,添加刷新UI的方法即可,而且电量温度等都是变化的 ...

最新文章

  1. boost::statechart模块实现延迟错误的测试程序
  2. mysql 中 add2_计算器中的F,4,2,0,ADD2怎么调,MU键有什么用??急急急
  3. redis spring 切面缓存_今日份学习: Spring中使用AOP并实现redis缓存?
  4. 服务器安装mysql_阿里云服务器上安装MySQL
  5. 备份不等于归档,在智能归档中备份资产!
  6. app个人健康管理系统开源_开源会促进心理健康吗?
  7. pythonjam教程_Python学习:安装配置pycharm编辑器教程
  8. sqlserver不太常见的,可能常见但又疑问的tsql语句
  9. 5.Struts2配置形式,覆盖
  10. 用java编写录音机类_java实现录音机
  11. 拇指玩安装器提示“存储卡空间不足”的解决办法
  12. Linux路由选择与策略路由
  13. python如何下载安装spacy_SpaCy下载及安装
  14. 简述线性和非线性电路及其区别
  15. 重量级锁 synchronized
  16. 让你提前认识软件开发(8):memset()与memcpy()函数
  17. 【计算机网络】什么是因特网
  18. mysql数据库复合索引
  19. python中使用什么命令安装组件_在离线环境下安装python组件
  20. Collider组件与Rigidbody组件杂谈

热门文章

  1. 图 | 为什么存在关于图的研究
  2. 《css设计彻底研究》读书笔记之 float 浮动原理
  3. ASP.NET高级配置Web.config和Machine.Config
  4. 005 - react
  5. 【电商系统】—项目梳理(一)
  6. 百度地图API的使用教程以及案例
  7. 经常看到网吧无盘系统,那操作系统装在哪?
  8. 银行卡预留号码注销了怎么改?
  9. 为什么现在很多公司和员工签订了合同之后都不给员工一份?
  10. 怎么选一个合适的手机?需要大内存,价格不太高的?