这次来总结一下我用到的Android原生获取经纬度和地址信息的案例,喜欢的可以收藏下,不喜勿喷!!!
1、一般来说,既然获取经纬度等信息,就需要获取定位权限啦。
可以在你的首页或者应用启动时先写获取权限的逻辑。。。
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><!-- 粗略的位置权限 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 精确的位置权限 -->
/*网络权限也需要 ,此处我就不多说了*/
//
private static final int PERMISSIONS_REQUEST_CODE = 1024;
//此方法为获取权限
private boolean checkAndRequestPermission() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return true;
}
List<String> lackedPermission = new ArrayList<>();
if (!(checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)) {
lackedPermission.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if (!(checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED)) {
lackedPermission.add(Manifest.permission.ACCESS_COARSE_LOCATION);
if (lackedPermission.isEmpty()) {
return true;
}
// 请求缺少的权限,在 onRequestPermissionsResult 中返回是否获得权限
String[] requestPermissions = new String[lackedPermission.size()];
lackedPermission.toArray(requestPermissions);
requestPermissions(requestPermissions, PERMISSIONS_REQUEST_CODE);
return false;
}
//权限的回调
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[]
grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSIONS_REQUEST_CODE) {
/*此处做你的处理*/
}
}
//次处实例如何调用,实例为权限全部请求成功
if (checkAndRequestPermission()) {//检查权限
loadSplashAd();//打开开屏广告
timeType = true;
}
2、权限获取成功之后,开始获取经纬度以及地址信息。(这是我查阅网上资料整理的一个工具类,可直接使用哦)
/**
* 获取经纬度、位置工具类
*/
public class LocationUtils {
@SuppressLint("StaticFieldLeak")
private volatile static LocationUtils uniqueInstance;
private LocationManager locationManager;
private String locationProvider;
private Location location;
private final 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;
}
//获取经纬度location
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 static String getAddress(Context context,Location location) {
List<Address> result = null;
String address = null;
try {
if (location != null) {
Geocoder gc = new Geocoder(context, Locale.getDefault());
result = gc.getFromLocation(location.getLatitude(),
location.getLongitude(), 1);
// result = gc.getFromLocation(37.833832912379386,
// 112.4759295159054, 1);
Toast.makeText(context, "获取地址信息:" + result.toString(), Toast.LENGTH_LONG).show();
Log.v("TAG", "获取地址信息:" + result.toString());
for (int i = 0; i < result.size(); i++) {
Log.d("TAG", result.get(i).getSubAdminArea());//开发区
Log.d("TAG", result.get(i).getAdminArea());//山西省
Log.d("TAG", result.get(i).getLocality());//晋城市
Log.d("TAG", result.get(i).getAddressLine(0));
address = result.get(i).getAddressLine(0);
}
//admin=山西省,sub-admin=长风西街街道,locality=太原市
//admin=山西省,sub-admin=开发区,locality=晋城市
}
} catch (Exception e) {
e.printStackTrace();
}
return address;
}
}
3、接下来就是使用啦!!!
/*直接在你需要的地方这样使用即可,经纬度和位置信息看注释*/
//获取位置location
Location location = LocationUtils.getInstance(this).showLocation();
if (location != null) {
String tude = "纬度:" + location.getLatitude() + "经度:" + location.getLongitude();
Log.d("FLY.LocationUtils", tude);
latitude = location.getLatitude();//纬度
longitude = location.getLongitude();//经度
address = LocationUtils.getAddress(this, location);//位置信息
} else {
Log.i("FLY.LocationUtils", "address");
}