Android之獲取地理位置

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) {}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章