Android GPS NETWORK定位
阿新 • • 發佈:2018-12-07
Android 定位
定位所需許可權:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
LocationManager:
LocationManager manager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
Location Provider:
android系統存在多種provider
1)GPS_PROVIDER: 手機裡有GPS晶片,然後利用該晶片就能利用衛星獲得自己的位置資訊。 第一次時間慢,但定位精準
2)NETWORK_PROVIDER:利用網路定位,一般是利用手機基站和WIFI節點的地址來大致定位位置
3)PASSIVE_PROVIDER: 被動定位方式。這個意思也比較明顯。就是用現成的,當其它應用使用定位更新了定位資訊。系統會儲存下來。該應用接收到訊息後直接讀取就能夠了
/** * 判斷裝置 具備哪種定位provider * <p> * 優先採用 netWork * <p> * GPS 耗時耗電 * * @param locationManager * @return */ private String judgeProvider(LocationManager locationManager) { List<String> prodiverlist = locationManager.getProviders(true); if (prodiverlist.contains(LocationManager.NETWORK_PROVIDER)) { return LocationManager.NETWORK_PROVIDER;//網路定位 } else if (prodiverlist.contains(LocationManager.GPS_PROVIDER)) { return LocationManager.GPS_PROVIDER;//GPS定位 (返回時間較長 第一次可能2-5分鐘) } return null; }
獲取定位資訊
/** * 獲取定位資訊 * * @return */ @SuppressLint("MissingPermission") public void getLocationInfo(Context context) { manager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); if (null != manager) { String provider = judgeProvider(manager); if (null != provider) { /** * 間隔時間 60 * 60 * 1000 ms * 間隔位置 1000 m * * @param minTime minimum time interval between location updates, in milliseconds * @param minDistance minimum distance between location updates, in meters */ manager.requestLocationUpdates(provider, 60 * 60 * 1000, 1000, locationListener); } } } private LocationListener locationListener = new LocationListener() { /** * 位置資訊變化時觸發 * @param location */ @Override public void onLocationChanged(Location location) { Log.i(TAG, "時間:" + location.getTime()); Log.i(TAG, "經度:" + location.getLongitude()); Log.i(TAG, "緯度:" + location.getLatitude()); Log.i(TAG, "海拔:" + location.getAltitude()); //解析具體詳細位置資訊 if (null != location) { getAddress(location); } } /** * GPS狀態變化時觸發 * @param provider * @param status * @param extras */ @Override public void onStatusChanged(String provider, int status, Bundle extras) { switch (status) { //GPS狀態為可見時 case LocationProvider.AVAILABLE: Log.i(TAG, "當前GPS狀態為可見狀態"); break; //GPS狀態為服務區外時 case LocationProvider.OUT_OF_SERVICE: Log.i(TAG, "當前GPS狀態為服務區外狀態"); break; //GPS狀態為暫停服務時 case LocationProvider.TEMPORARILY_UNAVAILABLE: Log.i(TAG, "當前GPS狀態為暫停服務狀態"); break; } } /** * GPS開啟時觸發 */ @Override public void onProviderEnabled(String provider) { } /** * GPS禁用時觸發 */ @Override public void onProviderDisabled(String provider) { } };
獲取到Location之後,根據經緯度解析出詳細的位置資訊:
/**
* 獲取定位 詳細資訊
*
* @param location
* @return
*/
private List<Address> getAddress(Location location) {
List<Address> result = null;
try {
if (location != null) {
Geocoder gc = new Geocoder(context, Locale.getDefault());
result = gc.getFromLocation(location.getLatitude(),
location.getLongitude(), 1);
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
在Address類中會有詳細位置資訊內容。