DBMNG数据库管理与应用

科学是实事求是的学问,来不得半点虚假。
当前位置:首页 > SQLite > 管理工具

android定位方式

最近在看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>
*/
publicclass LocationAct extends Activity { 
private TextView txtInfo; 
publicvoid 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() { 
publicvoid onClick(View view) { 
                 getLocation(); 
             } 
         }); 
     } 
privatevoid 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,这里只引用代码


publicclass MainActivity extends Activity {
private LocationManager locationManager;
private GpsStatus gpsstatus;
     @Override
publicvoid 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
publicvoid 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
publicvoid onLocationChanged(Location location) {
             Log.d("Location", "onLocationChanged");
         }

//provider失效时调用
         @Override
publicvoid onProviderDisabled(String provider) {
             Log.d("Location", "onProviderDisabled");
         }

//provider启用时调用
         @Override
publicvoid onProviderEnabled(String provider) {
             Log.d("Location", "onProviderEnabled");
         }

//状态改变时调用
         @Override
publicvoid 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;

publicclass MainActivity extends Activity {
     @Override
publicvoid 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
publicvoid onLocationChanged(Location location) {
             Log.d("Location", "onLocationChanged");
             Log.d("Location", "onLocationChanged Latitude" + location.getLatitude());
                  Log.d("Location", "onLocationChanged location" + location.getLongitude());
         }

//provider失效时调用
         @Override
publicvoid onProviderDisabled(String provider) {
             Log.d("Location", "onProviderDisabled");
         }

//provider启用时调用
         @Override
publicvoid onProviderEnabled(String provider) {
             Log.d("Location", "onProviderEnabled");
         }

//状态改变时调用
         @Override
publicvoid onStatusChanged(String provider, int status, Bundle extras) {
             Log.d("Location", "onStatusChanged");
         }
     };
}


Nothing is impossible!^oudi&orange^
本站文章内容,部分来自于互联网,若侵犯了您的权益,请致邮件chuanghui423#sohu.com(请将#换为@)联系,我们会尽快核实后删除。
Copyright © 2006-2023 DBMNG.COM All Rights Reserved. Powered by DEVSOARTECH            豫ICP备11002312号-2

豫公网安备 41010502002439号