最近需要對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); } }
寫到這裏簡單的定位和地址解析已經完成,可以使用得到的地理位置進行相關的開發。
原創文章,如需轉載,請註明出去~