先实现LocationListener接口 会重写四个方法
@Override
public void onLocationChanged(@NonNull Location location) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(@NonNull String provider) {
}
@Override
public void onProviderDisabled(@NonNull String provider) {
}
写一个判断是否打开定位的方法,如果没有开启定位 则跳转到定位页面手动开定位
private void checkIsOpen() {
locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
boolean isOpen = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
if (!isOpen) {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivityForResult(intent, 0);
}
startLocation();
}
然后开始GPS定位,第一个参数填“gps“,后面两个参数是每次更新的时长和定位距离的误差
记得开权限,
如果用的Android Studio 会提示你添加权限,点了就会自动添加,然后它还会再提示你一个检查的东西,还是点击添加即可。
private void startLocation() {
locationManager.requestLocationUpdates("gps", 2000, 10, this);
}
然后开始在onLocationChanged方法里写获取定位的经纬度,城市信息。
public void onLocationChanged(@NonNull Location location) {
lat = location.getLatitude();
lng = location.getLongitude();
List list = null;
Geocoder gd = new Geocoder(getActivity());
try {
list= gd.getFromLocation(lat, lng, 2);
} catch (IOException e) {
e.printStackTrace();
}
if (list != null && list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
Address address = list.get(i);
cityHome = address.getLocality();
}
top_city.setText(cityHome);
putSp();
}
}
最后可以写一个SharedPreferences保存位置信息,下次登录时候直接获取上次保存的定位信息就不用再开定位了,这里可以加一个判断,如果获取信息失败则开启定位重新定位。
private void putSp() {
editor = getActivity().getSharedPreferences("dp", Context.MODE_PRIVATE).edit();
editor.putString("cityHome", cityHome);
editor.apply();
}
private String getSp() {
return getActivity().getSharedPreferences("dp", Context.MODE_PRIVATE).getString("cityHome", "获取失败");
}
初始化开始,如果没有上次定位信息,则开始执行开启定位和判断更新位置信息。
@Override
public void onStart() {
super.onStart();
if (getSp().equals("获取失败")) {
checkIsOpen();
}
}