標籤:android style blog http io ar os sp java
一共有三種定位方式,一種是GPS,一種是通過網路的方式,一種則是在基於基站的方式,但是,不管哪種方式,都需要開啟網路或者GPS
首先添加許可權
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
在COARSE_LOCATION是用於基站定位的時候用的,沒有這個許可權,在擷取getCellLocation的時候報錯。
第一種方式通過JASON來實現,是通過基站方式的,引用文章地址:http://www.cnblogs.com/dartagnan/archive/2011/3/9.html,下載只是實現定位的代碼
/** * Google定位的實現.<br/> * Geolocation的詳細資料請參見:<br/> * <a * href="http://code.google.com/apis/gears/geolocation_network_protocol.html" mce_href="http://code.google.com/apis/gears/geolocation_network_protocol.html"> * http://code.google.com/apis/gears/geolocation_network_protocol.html</a> */ public class LocationAct extends Activity { private TextView txtInfo; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btn = (Button) findViewById(R.id.btnStart); txtInfo = (TextView) findViewById(R.id.txtInfo); btn.setOnClickListener(new Button.OnClickListener() { public void onClick(View view) { getLocation(); } }); } private void getLocation() { TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); GsmCellLocation gsmCell = (GsmCellLocation) tm.getCellLocation(); int cid = gsmCell.getCid(); int lac = gsmCell.getLac(); String netOperator = tm.getNetworkOperator(); int mcc = Integer.valueOf(netOperator.substring(0, 3)); int mnc = Integer.valueOf(netOperator.substring(3, 5)); JSONObject holder = new JSONObject(); JSONArray array = new JSONArray(); JSONObject data = new JSONObject(); try { holder.put("version", "1.1.0"); holder.put("host", "maps.google.com"); holder.put("address_language", "zh_CN"); holder.put("request_address", true); holder.put("radio_type", "gsm"); holder.put("carrier", "HTC"); data.put("cell_id", cid); data.put("location_area_code", lac); data.put("mobile_countyr_code", mcc); data.put("mobile_network_code", mnc); array.put(data); holder.put("cell_towers", array); } catch (JSONException e) { e.printStackTrace(); } DefaultHttpClient client = new DefaultHttpClient(); HttpPost httpPost = new HttpPost("http://www.google.com/loc/json"); StringEntity stringEntity = null; try { stringEntity = new StringEntity(holder.toString()); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } httpPost.setEntity(stringEntity); HttpResponse httpResponse = null; try { httpResponse = client.execute(httpPost); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } HttpEntity httpEntity = httpResponse.getEntity(); InputStream is = null; try { is = httpEntity.getContent(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } InputStreamReader isr = new InputStreamReader(is); BufferedReader reader = new BufferedReader(isr); StringBuffer stringBuffer = new StringBuffer(); try { String result = ""; while ((result = reader.readLine()) != null) { stringBuffer.append(result); } } catch (IOException e) { e.printStackTrace(); } txtInfo.setText(stringBuffer.toString()); } }
第二種通過嚴格的GPS來定位,引用文章地址:http://www.cnblogs.com/wisekingokok/archive/2011/09/06/2168479.html,這裡只引用代碼
public class MainActivity extends Activity { private LocationManager locationManager; private GpsStatus gpsstatus; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //擷取到LocationManager對象 locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); //根據設定的Criteria對象,擷取最符合此標準的provider對象 String currentProvider = locationManager.getProvider(LocationManager.GPS_PROVIDER).getName(); //根據當前provider對象擷取最後一次位置資訊 Location currentLocation = locationManager.getLastKnownLocation(currentProvider); //如果位置資訊為null,則請求更新位置資訊 if(currentLocation == null){ locationManager.requestLocationUpdates(currentProvider, 0, 0, locationListener); } //增加GPS狀態監聽器 locationManager.addGpsStatusListener(gpsListener); //直到獲得最後一次位置資訊為止,如果未獲得最後一次位置資訊,則顯示預設經緯度 //每隔10秒擷取一次位置資訊 while(true){ currentLocation = locationManager.getLastKnownLocation(currentProvider); if(currentLocation != null){ Log.d("Location", "Latitude: " + currentLocation.getLatitude()); Log.d("Location", "location: " + currentLocation.getLongitude()); break; }else{ Log.d("Location", "Latitude: " + 0); Log.d("Location", "location: " + 0); } try { Thread.sleep(10000); } catch (InterruptedException e) { Log.e("Location", e.getMessage()); } } } private GpsStatus.Listener gpsListener = new GpsStatus.Listener(){ //GPS狀態發生變化時觸發 @Override public void onGpsStatusChanged(int event) { //擷取目前狀態 gpsstatus=locationManager.getGpsStatus(null); switch(event){ //第一次定位時的事件 case GpsStatus.GPS_EVENT_FIRST_FIX: break; //開始定位的事件 case GpsStatus.GPS_EVENT_STARTED: break; //發送GPS衛星狀態事件 case GpsStatus.GPS_EVENT_SATELLITE_STATUS: Toast.makeText(MainActivity.this, "GPS_EVENT_SATELLITE_STATUS", Toast.LENGTH_SHORT).show(); Iterable<GpsSatellite> allSatellites = gpsstatus.getSatellites(); Iterator<GpsSatellite> it=allSatellites.iterator(); int count = 0; while(it.hasNext()) { count++; } Toast.makeText(MainActivity.this, "Satellite Count:" + count, Toast.LENGTH_SHORT).show(); break; //停止定位事件 case GpsStatus.GPS_EVENT_STOPPED: Log.d("Location", "GPS_EVENT_STOPPED"); break; } } }; //建立位置監聽器 private LocationListener locationListener = new LocationListener(){ //位置發生改變時調用 @Override public void onLocationChanged(Location location) { Log.d("Location", "onLocationChanged"); } //provider失效時調用 @Override public void onProviderDisabled(String provider) { Log.d("Location", "onProviderDisabled"); } //provider啟用時調用 @Override public void onProviderEnabled(String provider) { Log.d("Location", "onProviderEnabled"); } //狀態改變時調用 @Override public void onStatusChanged(String provider, int status, Bundle extras) { Log.d("Location", "onStatusChanged"); } }; }
第三種主要是通過網路的方式來定位,引用文章地址:http://www.cnblogs.com/wisekingokok/archive/2011/09/05/2167755.html,這裡唯寫代碼
package com.test; import java.io.IOException; import java.util.List; import android.app.Activity; import android.location.Address; import android.location.Criteria; import android.location.Geocoder; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.util.Log; import android.widget.Toast; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //擷取到LocationManager對象 LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); //建立一個Criteria對象 Criteria criteria = new Criteria(); //設定粗略精確度 criteria.setAccuracy(Criteria.ACCURACY_COARSE); //設定是否需要返回海拔資訊 criteria.setAltitudeRequired(false); //設定是否需要返回方位資訊 criteria.setBearingRequired(false); //設定是否允許付費服務 criteria.setCostAllowed(true); //設定電量消耗等級 criteria.setPowerRequirement(Criteria.POWER_HIGH); //設定是否需要返回速度資訊 criteria.setSpeedRequired(false); //根據設定的Criteria對象,擷取最符合此標準的provider對象 String currentProvider = locationManager.getBestProvider(criteria, true); Log.d("Location", "currentProvider: " + currentProvider); //根據當前provider對象擷取最後一次位置資訊 Location currentLocation = locationManager.getLastKnownLocation(currentProvider); //如果位置資訊為null,則請求更新位置資訊 if(currentLocation == null){ locationManager.requestLocationUpdates(currentProvider, 0, 0, locationListener); } //直到獲得最後一次位置資訊為止,如果未獲得最後一次位置資訊,則顯示預設經緯度 //每隔10秒擷取一次位置資訊 while(true){ currentLocation = locationManager.getLastKnownLocation(currentProvider); if(currentLocation != null){ Log.d("Location", "Latitude: " + currentLocation.getLatitude()); Log.d("Location", "location: " + currentLocation.getLongitude()); break; }else{ Log.d("Location", "Latitude: " + 0); Log.d("Location", "location: " + 0); } try { Thread.sleep(10000); } catch (InterruptedException e) { Log.e("Location", e.getMessage()); } } //解析地址並顯示 Geocoder geoCoder = new Geocoder(this); try { int latitude = (int) currentLocation.getLatitude(); int longitude = (int) currentLocation.getLongitude(); List<Address> list = geoCoder.getFromLocation(latitude, longitude, 2); for(int i=0; i<list.size(); i++){ Address address = list.get(i); Toast.makeText(MainActivity.this, address.getCountryName() + address.getAdminArea() + address.getFeatureName(), Toast.LENGTH_LONG).show(); } } catch (IOException e) { Toast.makeText(MainActivity.this,e.getMessage(), Toast.LENGTH_LONG).show(); } } //建立位置監聽器 private LocationListener locationListener = new LocationListener(){ //位置發生改變時調用 @Override public void onLocationChanged(Location location) { Log.d("Location", "onLocationChanged"); Log.d("Location", "onLocationChanged Latitude" + location.getLatitude()); Log.d("Location", "onLocationChanged location" + location.getLongitude()); } //provider失效時調用 @Override public void onProviderDisabled(String provider) { Log.d("Location", "onProviderDisabled"); } //provider啟用時調用 @Override public void onProviderEnabled(String provider) { Log.d("Location", "onProviderEnabled"); } //狀態改變時調用 @Override public void onStatusChanged(String provider, int status, Bundle extras) { Log.d("Location", "onStatusChanged"); } };
android 三種定位方式