Android 三种定位方式

来源:互联网 发布:大数据金融企业 编辑:程序博客网 时间:2024/05/22 04:25

最近在看android关于定位的方式,查了很多资料,也做了相关实验,在手机上做了测试,下面总结:

一共有三种定位方式,一种是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");         }     }; }
原文链接:http://www.cnblogs.com/oudi/archive/2012/03/22/2411509.html
0 0