Android利用谷歌地圖獲取並解析經緯度對應的地理位置

    最近需要對GPS定位信息進行地理位置解析,看到一些文章裏面建議使用百度地圖API來做,不過考慮到百度地圖在國外的使用體驗,還是想試試通過Google地圖來進行地理位置獲取,閒話不多說,上代碼。

首先當然需要檢查GPS功能模塊以及GPS開啓狀態,同時在使用GPS時需要考慮到GPS權限請求:

/**
 * check if it has any gps provider
 * @return boolean
 */
public boolean isHasGPSModule(){
    // TODO Auto-generated method stub
    LocationManager lmManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    if (lmManager != null) {
        List<String> mProviders = lmManager.getAllProviders();
        if (mProviders != null && mProviders.contains(LocationManager.GPS_PROVIDER)) {
            return true;
        }
    }
    return false;
}

/**
 * Check if GPS opened
 *
 * @return boolean
 */
private boolean checkGPSIsOpen() {
    boolean isOpen;
    LocationManager locationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE);
    isOpen = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    return isOpen;
}
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

確認GPS處於開啓使用後,註冊位置監聽:

if (isHasGPSModule()) {
    lmManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    Criteria criteria = new Criteria();
    criteria.setAccuracy(Criteria.ACCURACY_LOW);
    criteria.setAltitudeRequired(true);
    criteria.setBearingRequired(true);
    criteria.setCostAllowed(true);
    criteria.setPowerRequirement(Criteria.POWER_LOW);

    String provider = lmManager.getBestProvider(criteria, true);
    Log.i("GPS", "bestprovider=" + provider);
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
            != PackageManager.PERMISSION_GRANTED &&
            ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
                    != PackageManager.PERMISSION_GRANTED) {
        // TODO: Consider calling
        //    ActivityCompat#requestPermissions
        // here to request the missing permissions, and then overriding
        //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
        //                                          int[] grantResults)
        // to handle the case where the user grants the permission. See the documentation
        // for ActivityCompat#requestPermissions for more details.
        return;
    }
    Location location = lmManager.getLastKnownLocation(provider);
    if (location != null) {
        updateWithNewLocation(location);
    } else {
        lmManager.requestLocationUpdates(provider, 5000L, 20f, locationListener);
        showProgressDialog("search location ...");
    }
}
等待位置更新onLocationChanged:

LocationListener locationListener = new LocationListener() {
    @Override
    public void onLocationChanged(Location location) {
        // TODO Auto-generated method stub
        Log.i("GPS", "Locationchanged");
        dismissProgressDialog();
        lmManager.removeUpdates(locationListener);
        updateWithNewLocation(location);
    }

    @Override
    public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub

    }
};
接下來,重點來了,使用得到的location信息去請求位置:

private void updateWithNewLocation(Location location) {
    Log.i("GPS", "updateLocation");
    String latitude = String.valueOf(location.getLatitude());
    String longitude = String.valueOf(location.getLongitude());
    Log.i("GPS", "updateLocation" + "latitude=" + latitude + "longitude=" + longitude);
    
    String url = String.format(
            "http://maps.google.cn/maps/api/geocode/json?latlng=%s,%s&sensor=false&language=en_us",
            latitude, longitude); //請求的鏈接是重點,嘗試了很多次,默認語言中文,這裏由於需要設置成美國英語
    sendLocationAdressRequest(url);
}
進行網絡請求並得到位置信息:

private void sendLocationAdressRequest(String address) {
    HttpUtil.sendOkHttpRequest(address, new okhttp3.Callback() {
        @Override
        public void onResponse(Call call, Response response) throws IOException {
            if (response != null && !isResponse) {
                isResponse = true;
                String responseData = response.body().string();
                // get address
                
showResponse(responseData);
Log.i("GPS", "responseData=" + responseData); } } @Override public void onFailure(Call call, IOException e) { Log.i("GPS", "request address form Google map failure"); } });}


private String showResponse(String response) {
    JSONObject jsonObj = null;
    String result = "";
    try {
        // 把服務器相應的字符串轉換爲JSONObject
        jsonObj = new JSONObject(response);
        // 解析出響應結果中的地址數據
        JSONArray jsonArray = jsonObj.getJSONArray("results");
        Log.i("GPS", "lenth = " + jsonArray.length());
        result = jsonArray.getJSONObject(jsonArray.length() - 1).getString("formatted_address");
        /*result =  jsonObj.getJSONArray(0).getString("formatted_address");*/
        // 此處jsonArray.length()-1得到的位置信息是最後一列,得到的是Google地圖劃分區域的最外層,
        // 如國家或者特殊城市-香港等,若需要得到具體位置使用0        Log.i("GPS", "address json result = " + result);
    } catch (JSONException e) {
        e.printStackTrace();
        Log.i("GPS", "address json result error");
    }
    return result;
}

在這裏主要感謝這兩篇文章:http://blog.csdn.net/fulianwu/article/details/6540890 和 http://blog.sina.com.cn/s/blog_4b20ae2e0101b2eo.html

以及郭臨大神的《Android第一行代碼》中對於okhttp3的工具類的使用:

public class HttpUtil {
    public static void sendOkHttpRequest(String url, okhttp3.Callback callback){
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(ur)
                .build();
        client.newCall(request).enqueue(callback);
    }
}

寫到這裏簡單的定位和地址解析已經完成,可以使用得到的地理位置進行相關的開發。

原創文章,如需轉載,請註明出去~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章