Android之獲取地理位置
權限
// 清單文件中配置
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
// 申請權限
private String[] locationPermission = {Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION};
requestPermission(locationPermission, new RequestPermissionCallBack() {
@Override
public void onGranted(String[] permissions) {
// 初始化
initLocation();
}
@Override
public void onDenied(String[] permissions) {
showToast(R.string.app_have_no_permission);
}
});
創建/銷燬線程
private void startHandler() {
if (mainHandler == null) {
mainHandler = new Handler(Looper.getMainLooper());
}
if (workHandler == null) {
handlerThread = new HandlerThread("handlerThread");
handlerThread.start();
workHandler = new Handler(handlerThread.getLooper());
}
}
private void stopHandler() {
if (mainHandler != null) {
mainHandler.removeCallbacksAndMessages(null);
mainHandler = null;
}
if (handlerThread != null) {
handlerThread.quit();
handlerThread = null;
}
if (workHandler != null) {
workHandler.removeCallbacksAndMessages(null);
workHandler = null;
}
}
初始化
// 移除監聽
removeLocationListener();
//獲取地理位置管理器
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
if (locationManager == null) return;
//獲取所有可用的位置提供器
List<String> providers = locationManager.getProviders(true);
if (providers.size() <= 0) return;
String locationProvider;
if (providers.contains(LocationManager.NETWORK_PROVIDER)) {
//如果是Network
locationProvider = LocationManager.NETWORK_PROVIDER;
} else if (providers.contains(LocationManager.GPS_PROVIDER)) {
//如果是GPS
locationProvider = LocationManager.GPS_PROVIDER;
} else {
return;
}
//獲取Location
Location location = locationManager.getLastKnownLocation(locationProvider);
if (location != null) {
getAddress(location);
}
locationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
if (location == null) return;
getAddress(location);
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
};
// 設置監聽
locationManager.requestLocationUpdates(locationProvider, 1000, 0f, locationListener);
移除監聽
if(locationManager != null){
locationManager.removeUpdates(locationListener);
}
解析位置
private void getAddress(Location location) {
workHandler.post(() -> {
try {
if (location != null) {
Geocoder gc = new Geocoder(this, Locale.getDefault());
List<Address> result = gc.getFromLocation(location.getLatitude(),
location.getLongitude(), 1);
if (result.size() > 0) {
Address address = result.get(0);
mainHandler.post(() -> handleCountryAndArea(address ));
}
}
} catch (Exception e) {
e.printStackTrace();
}
});
}
// 處理地址信息
public void handleCountryAndArea(Address address) {}