前言:花了一个早上研究了以下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() { @Override
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
// TODO Auto-generated method stub } @Override
public void onProviderEnabled(String arg0) {
// TODO Auto-generated method stub } @Override
public void onProviderDisabled(String arg0) {
// TODO Auto-generated method stub } @Override
public 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 block
Toast.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)
@Override
protected void onCreate(Bundle savedInstanceState)
  {。。。}
加一个@TargetApi(Build.VERSION_CODES.M)这样就没事了。   5.线程呢,线程呢?不要急,在下面=====
  
 new Thread(new Runnable() {
@Override
public void run() {
try {
str_location= LocationUtil.getAddress(LocationUtil.location,getApplicationContext());
//位置信息-----一个字符串
}catch (IOException e){
e.printStackTrace();
}
handler_location.post(new Runnable() {
@Override
public 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.继续干!!!

 

  

Android 获取地理位置信息 封装好了 直接用的更多相关文章

  1. Android 获取地理位置的经度和纬度(zz)

    在Android应用程序中,可以使用LocationManager来获取移动设备所在的地理位置信息.看如下实例:新建android应用程序TestLocation. 1.activity_main.x ...

  2. HTML5 获取地理位置信息

    HTML5增加的新功能,获取地理位置信息,如果浏览器支持且设备有定位功能,就能够直接使用这组API来获取当前信息位置.该Geolocation API可以应用于移动设备中的地理位置. Geolocat ...

  3. Html5 Geolocation获取地理位置信息

    Html5中提供了地理位置信息的API,通过浏览器来获取用户当前位置.基于此特性可以开发基于位置的服务应用.在获取地理位置信息前,首先浏览器都会向用户询问是否愿意共享其位置信息,待用户同意后才能使用. ...

  4. I.MX6 android 获取framebuffer信息

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

  5. AngularJS进阶(二十)HTML5实现获取地理位置信息并定位功能

    HTML5实现获取地理位置信息并定位功能 注:请点击此处进行充电! 前言 这篇文章主要介绍了HTML5实现获取地理位置信息并定位功能,本文讲解了原生HTML5.百度地图.谷歌地图等三种获取理位置信息并 ...

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

    这里主要讲h5实现获取地理位置信息并定位功能,本文讲解了原生h5,百度地图,谷歌地图等三种获取地理信息并定位的方法,需要的朋友可以参考下: h5提供了地理位置功能(Geolocation API),能 ...

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

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

  8. Android 获取手机信息,设置权限,申请权限,查询联系人,获取手机定位信息

    Android 获取手机信息,设置权限,申请权限,查询联系人,获取手机定位信息 本文目录: 获取手机信息 设置权限 申请权限 查询联系人 获取手机定位信息 调用高德地图,设置显示2个坐标点的位置,以及 ...

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

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

随机推荐

  1. Employees Earning More Than Their Managers

    The Employee table holds all employees including their managers. Every employee has an Id, and there ...

  2. 洛谷 P1281 书的复制

    书的复制 Code: #include <iostream> #include <cstdio> #include <cstring> using namespac ...

  3. win10 asp+access

    今天是灰色的一天. 大清早来到单位,告知:单位主页访问不了! 我远程看了下.所有的文件后缀都变成了.crab 赶紧上网查下,哎呀我的妈呀,这是中了勒索病毒啊. 还用查?打开服务器,有个打开的文本文件写 ...

  4. A promise tomorrow is worth a lot less than trying today.

    A promise tomorrow is worth a lot less than trying today.明日的承诺远不及今日的行动.

  5. Tomcat8

    一.Apache Tomcat 8介绍 Tomcat 8.0.0-RC3 (alpha) Released                                                ...

  6. nginx 中 root和alias

    根本区别 一个请求的url= http://ip:port/path 在location中配置root和alias的区别: root是在location的正则之前拼接了路径 alias是在locati ...

  7. oracle最高账号sys的密码认证模式

    CONNECT USERNAME/PASSWORD@SERVERNAME AS SYSDBAconnect 是指连接到username是指用户名password是指密码servername是指服务名a ...

  8. mybatis-关联关系

    在实现实列中我们在学生表里面增加了一个地址表用于与学生表的一对一 1.创建地址实体类: package com.java1234.mappers; import com.java1234.model. ...

  9. JAVA入门2019-JAVA配置(windows7和10通用)IDE推荐和相关软件

    如何安装JDK 首先,略过"什么是JDK",非要问,这就是编译环境,JRE是运行环境.一个写程序,一个部署运行. 下载的方法:百度 java se 或者openJDK(两个差不多, ...

  10. Sonar服务器搭建

    Sonar服务器搭建 Sonar概述 Sonar 是一个用于代码质量管理的开放平台.通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具.与持续集成工具(例如 Hudson ...