1权限: <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
第一种方式通过JASON来实现,是通过基站方式的,引用文章地址:http://www.cnblogs.com/dartagnan/archive/2011/3/9.html,下载只是实现定位的代码
1 /** 2 * Google定位的实现.<br/> 3 * Geolocation的详细信息请参见:<br/> 4 * <a 5 * href="http://code.google.com/apis/gears/geolocation_network_protocol.html" mce_href="http://code.google.com/apis/gears/geolocation_network_protocol.html"> 6 * http://code.google.com/apis/gears/geolocation_network_protocol.html</a> 7 */ 8 public class LocationAct extends Activity { 9 private TextView txtInfo; 10 public void onCreate(Bundle savedInstanceState) { 11 super.onCreate(savedInstanceState); 12 setContentView(R.layout.main); 13 Button btn = (Button) findViewById(R.id.btnStart); 14 txtInfo = (TextView) findViewById(R.id.txtInfo); 15 btn.setOnClickListener(new Button.OnClickListener() { 16 public void onClick(View view) { 17 getLocation(); 18 } 19 }); 20 } 21 private void getLocation() { 22 TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 23 GsmCellLocation gsmCell = (GsmCellLocation) tm.getCellLocation(); 24 int cid = gsmCell.getCid(); 25 int lac = gsmCell.getLac(); 26 String netOperator = tm.getNetworkOperator(); 27 int mcc = Integer.valueOf(netOperator.substring(0, 3)); 28 int mnc = Integer.valueOf(netOperator.substring(3, 5)); 29 JSONObject holder = new JSONObject(); 30 JSONArray array = new JSONArray(); 31 JSONObject data = new JSONObject(); 32 try { 33 holder.put("version", "1.1.0"); 34 holder.put("host", "maps.google.com"); 35 holder.put("address_language", "zh_CN"); 36 holder.put("request_address", true); 37 holder.put("radio_type", "gsm"); 38 holder.put("carrier", "HTC"); 39 data.put("cell_id", cid); 40 data.put("location_area_code", lac); 41 data.put("mobile_countyr_code", mcc); 42 data.put("mobile_network_code", mnc); 43 array.put(data); 44 holder.put("cell_towers", array); 45 } catch (JSONException e) { 46 e.printStackTrace(); 47 } 48 DefaultHttpClient client = new DefaultHttpClient(); 49 HttpPost httpPost = new HttpPost("http://www.google.com/loc/json"); 50 StringEntity stringEntity = null; 51 try { 52 stringEntity = new StringEntity(holder.toString()); 53 } catch (UnsupportedEncodingException e) { 54 e.printStackTrace(); 55 } 56 httpPost.setEntity(stringEntity); 57 HttpResponse httpResponse = null; 58 try { 59 httpResponse = client.execute(httpPost); 60 } catch (ClientProtocolException e) { 61 e.printStackTrace(); 62 } catch (IOException e) { 63 e.printStackTrace(); 64 } 65 HttpEntity httpEntity = httpResponse.getEntity(); 66 InputStream is = null; 67 try { 68 is = httpEntity.getContent(); 69 } catch (IllegalStateException e) { 70 e.printStackTrace(); 71 } catch (IOException e) { 72 // TODO Auto-generated catch block 73 e.printStackTrace(); 74 } 75 InputStreamReader isr = new InputStreamReader(is); 76 BufferedReader reader = new BufferedReader(isr); 77 StringBuffer stringBuffer = new StringBuffer(); 78 try { 79 String result = ""; 80 while ((result = reader.readLine()) != null) { 81 stringBuffer.append(result); 82 } 83 } catch (IOException e) { 84 e.printStackTrace(); 85 } 86 txtInfo.setText(stringBuffer.toString()); 87 } 88 }
第二种通过严格的GPS来定位,引用文章地址:http://www.cnblogs.com/wisekingokok/archive/2011/09/06/2168479.html,这里只引用代码
1 public class MainActivity extends Activity { 2 private LocationManager locationManager; 3 private GpsStatus gpsstatus; 4 @Override 5 public void onCreate(Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 setContentView(R.layout.main); 8 9 //获取到LocationManager对象 10 locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 11 12 //根据设置的Criteria对象,获取最符合此标准的provider对象 13 String currentProvider = locationManager.getProvider(LocationManager.GPS_PROVIDER).getName(); 14 15 //根据当前provider对象获取最后一次位置信息 16 Location currentLocation = locationManager.getLastKnownLocation(currentProvider); 17 //如果位置信息为null,则请求更新位置信息 18 if(currentLocation == null){ 19 locationManager.requestLocationUpdates(currentProvider, 0, 0, locationListener); 20 } 21 //增加GPS状态监听器 22 locationManager.addGpsStatusListener(gpsListener); 23 24 //直到获得最后一次位置信息为止,如果未获得最后一次位置信息,则显示默认经纬度 25 //每隔10秒获取一次位置信息 26 while(true){ 27 currentLocation = locationManager.getLastKnownLocation(currentProvider); 28 if(currentLocation != null){ 29 Log.d("Location", "Latitude: " + currentLocation.getLatitude()); 30 Log.d("Location", "location: " + currentLocation.getLongitude()); 31 break; 32 }else{ 33 Log.d("Location", "Latitude: " + 0); 34 Log.d("Location", "location: " + 0); 35 } 36 try { 37 Thread.sleep(10000); 38 } catch (InterruptedException e) { 39 Log.e("Location", e.getMessage()); 40 } 41 } 42 } 43 44 private GpsStatus.Listener gpsListener = new GpsStatus.Listener(){ 45 //GPS状态发生变化时触发 46 @Override 47 public void onGpsStatusChanged(int event) { 48 //获取当前状态 49 gpsstatus=locationManager.getGpsStatus(null); 50 switch(event){ 51 //第一次定位时的事件 52 case GpsStatus.GPS_EVENT_FIRST_FIX: 53 break; 54 //开始定位的事件 55 case GpsStatus.GPS_EVENT_STARTED: 56 break; 57 //发送GPS卫星状态事件 58 case GpsStatus.GPS_EVENT_SATELLITE_STATUS: 59 Toast.makeText(MainActivity.this, "GPS_EVENT_SATELLITE_STATUS", Toast.LENGTH_SHORT).show(); 60 Iterable<GpsSatellite> allSatellites = gpsstatus.getSatellites(); 61 Iterator<GpsSatellite> it=allSatellites.iterator(); 62 int count = 0; 63 while(it.hasNext()) 64 { 65 count++; 66 } 67 Toast.makeText(MainActivity.this, "Satellite Count:" + count, Toast.LENGTH_SHORT).show(); 68 break; 69 //停止定位事件 70 case GpsStatus.GPS_EVENT_STOPPED: 71 Log.d("Location", "GPS_EVENT_STOPPED"); 72 break; 73 } 74 } 75 }; 76 77 78 //创建位置监听器 79 private LocationListener locationListener = new LocationListener(){ 80 //位置发生改变时调用 81 @Override 82 public void onLocationChanged(Location location) { 83 Log.d("Location", "onLocationChanged"); 84 } 85 86 //provider失效时调用 87 @Override 88 public void onProviderDisabled(String provider) { 89 Log.d("Location", "onProviderDisabled"); 90 } 91 92 //provider启用时调用 93 @Override 94 public void onProviderEnabled(String provider) { 95 Log.d("Location", "onProviderEnabled"); 96 } 97 98 //状态改变时调用 99 @Override 100 public void onStatusChanged(String provider, int status, Bundle extras) { 101 Log.d("Location", "onStatusChanged"); 102 } 103 }; 104 }
第三种主要是通过网络的方式来定位,引用文章地址:http://www.cnblogs.com/wisekingokok/archive/2011/09/05/2167755.html,这里只写代码
1 package com.test; 2 3 import java.io.IOException; 4 import java.util.List; 5 6 import android.app.Activity; 7 import android.location.Address; 8 import android.location.Criteria; 9 import android.location.Geocoder; 10 import android.location.Location; 11 import android.location.LocationListener; 12 import android.location.LocationManager; 13 import android.os.Bundle; 14 import android.util.Log; 15 import android.widget.Toast; 16 17 public class MainActivity extends Activity { 18 @Override 19 public void onCreate(Bundle savedInstanceState) { 20 super.onCreate(savedInstanceState); 21 setContentView(R.layout.main); 22 23 //获取到LocationManager对象 24 LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 25 //创建一个Criteria对象 26 Criteria criteria = new Criteria(); 27 //设置粗略精确度 28 criteria.setAccuracy(Criteria.ACCURACY_COARSE); 29 //设置是否需要返回海拔信息 30 criteria.setAltitudeRequired(false); 31 //设置是否需要返回方位信息 32 criteria.setBearingRequired(false); 33 //设置是否允许付费服务 34 criteria.setCostAllowed(true); 35 //设置电量消耗等级 36 criteria.setPowerRequirement(Criteria.POWER_HIGH); 37 //设置是否需要返回速度信息 38 criteria.setSpeedRequired(false); 39 40 //根据设置的Criteria对象,获取最符合此标准的provider对象 41 String currentProvider = locationManager.getBestProvider(criteria, true); 42 Log.d("Location", "currentProvider: " + currentProvider); 43 //根据当前provider对象获取最后一次位置信息 44 Location currentLocation = locationManager.getLastKnownLocation(currentProvider); 45 //如果位置信息为null,则请求更新位置信息 46 if(currentLocation == null){ 47 locationManager.requestLocationUpdates(currentProvider, 0, 0, locationListener); 48 } 49 //直到获得最后一次位置信息为止,如果未获得最后一次位置信息,则显示默认经纬度 50 //每隔10秒获取一次位置信息 51 while(true){ 52 currentLocation = locationManager.getLastKnownLocation(currentProvider); 53 if(currentLocation != null){ 54 Log.d("Location", "Latitude: " + currentLocation.getLatitude()); 55 Log.d("Location", "location: " + currentLocation.getLongitude()); 56 break; 57 }else{ 58 Log.d("Location", "Latitude: " + 0); 59 Log.d("Location", "location: " + 0); 60 } 61 try { 62 Thread.sleep(10000); 63 } catch (InterruptedException e) { 64 Log.e("Location", e.getMessage()); 65 } 66 } 67 68 //解析地址并显示 69 Geocoder geoCoder = new Geocoder(this); 70 try { 71 int latitude = (int) currentLocation.getLatitude(); 72 int longitude = (int) currentLocation.getLongitude(); 73 List<Address> list = geoCoder.getFromLocation(latitude, longitude, 2); 74 for(int i=0; i<list.size(); i++){ 75 Address address = list.get(i); 76 Toast.makeText(MainActivity.this, address.getCountryName() + address.getAdminArea() + address.getFeatureName(), Toast.LENGTH_LONG).show(); 77 } 78 } catch (IOException e) { 79 Toast.makeText(MainActivity.this,e.getMessage(), Toast.LENGTH_LONG).show(); 80 } 81 82 } 83 84 //创建位置监听器 85 private LocationListener locationListener = new LocationListener(){ 86 //位置发生改变时调用 87 @Override 88 public void onLocationChanged(Location location) { 89 Log.d("Location", "onLocationChanged"); 90 Log.d("Location", "onLocationChanged Latitude" + location.getLatitude()); 91 Log.d("Location", "onLocationChanged location" + location.getLongitude()); 92 } 93 94 //provider失效时调用 95 @Override 96 public void onProviderDisabled(String provider) { 97 Log.d("Location", "onProviderDisabled"); 98 } 99 100 //provider启用时调用 101 @Override 102 public void onProviderEnabled(String provider) { 103 Log.d("Location", "onProviderEnabled"); 104 } 105 106 //状态改变时调用 107 @Override 108 public void onStatusChanged(String provider, int status, Bundle extras) { 109 Log.d("Location", "onStatusChanged"); 110 } 111 }; 112 }