android 三種定位方式

來源:互聯網
上載者:User

標籤: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 三種定位方式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.