@SuppressLint("MissingPermission")
@TargetApi(Build.VERSION_CODES.M)
public Location getLocationInfo(Context context) {
locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); // 默认Android GPS定位实例
//用来存储最优的结果
// Location betterLocation = null;
//判断是否开启位置服务,没有则跳转至设置来开启
if (isLocationServiceOpen()) {
//获取所有支持的provider
List<String> providers = locationManager.getProviders(true);
for (String provider : providers) {
Location location1 = locationManager.getLastKnownLocation(provider);
if (location1 != null){
Log.i("TAG", "$provider 精度为:${it.accuracy}");
if (location == null) {
location = location1;
} else {
//因为半径等于精度,所以精度越低代表越准确
if (location1.getAccuracy() < location.getAccuracy())
location1 = location;
}
}
if (location1 == null) {
Log.i("TAG", "$provider 获取到的位置为null");
}
}
if (location!=null){
Log.i("TAG", "精度最高的获取方式:"+location.getProvider()+" 经度:"+location.getLongitude()+" 纬度:"+location.getLatitude());
}
//设置间隔两秒获得一次GPS定位信息
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 6000, 8, new LocationListener() {
@Override
public void onLocationChanged(Location location1) {
// 当GPS定位信息发生改变时,更新定位
location = location1;
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
// 当GPS LocationProvider可用时,更新定位
location = locationManager.getLastKnownLocation(provider);
}
@Override
public void onProviderDisabled(String provider) {
// updateShow(null);
}
});
//(四)若所支持的provider获取到的位置均为空,则开启连续定位服务
// if (betterLocation == null) {
// for (String provider : providers) {
//// locationMonitor(provider);
// }
// Log.i("TAG", "getLocationInfo: 获取到的经纬度均为空,已开启连续定位监听");
// }
} else {
Log.i("TAG", "请跳转到系统设置中打开定位服务");
}
return location;
}
@SuppressLint("MissingPermission")
private void locationMonitor(String provider) {
// if (PermissionUtil.requestPermission(
// 1,
// permissionList.toList(),
// this
// )
// ) {
locationManager.requestLocationUpdates(provider, (long) 6000, (float) 8, locationListener);
// }
}
private LocationListener locationListener =new LocationListener() {
@Override
public void onLocationChanged(Location location) {
//调用更新位置
// updateToNewLocation(location);
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
}
@Override
public void onProviderEnabled(String s) {
}
@Override
public void onProviderDisabled(String s) {
}
};
/**
* 判断定位服务是否开启
*/
private boolean isLocationServiceOpen() {
boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
boolean network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
//有一个开启就可
return gps || network;
}
class PermissionUtil {
/**
* 验证是否有权限,没有则申请
*/
public Boolean requestPermission(int requestCode , List<String> permissionList, Activity context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//没有同意需要申请的权限
List<String> requestPermissionList = new ArrayList();
for (String permission : permissionList) {
if (ContextCompat.checkSelfPermission(
context,
permission
) != PackageManager.PERMISSION_GRANTED
) {
requestPermissionList.add(permission);
}
}
if (requestPermissionList.size() > 0) {
ActivityCompat.requestPermissions(
context,
requestPermissionList.toArray(new String[]{}),
requestCode
);
return false;
} else {
return true;
}
} else {
return true;
}
}
/**
*验证权限申请的结果
*/
public boolean verifyResult(int[] grantResults,Context context) {
if (grantResults.length>=0) {
for (int result : grantResults) {
if (result != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(context, "必须同意所有权限才能使用该功能", Toast.LENGTH_SHORT).show();
return false;
}
}
return true;
} else {
Toast.makeText(context, "发生未知错误", Toast.LENGTH_SHORT).show();
return false;
}
}
}
Andorid获取原生GPS定位信息
最新推荐文章于 2025-10-10 11:22:20 发布
本文介绍了一段关于Android应用中获取地理位置信息的代码,包括GPS定位服务的检查、多种定位方式的选择、以及权限请求的处理。重点展示了如何判断位置服务状态并实现连续定位监听。
6390

被折叠的 条评论
为什么被折叠?



