当前位置:首页 > 芯闻号 > 充电吧
[导读]最近在看android关于定位的方式,查了很多资料,也做了相关实验,在手机上做了测试,下面总结:一共有三种定位方式,一种是GPS,一种是通过网络的方式,一种则是在基于基站的方式,但是,不管哪种方式,都

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

一共有三种定位方式,一种是GPS,一种是通过网络的方式,一种则是在基于基站的方式,但是,不管哪种方式,都需要开启网络或者GPS

 

首先添加权限


在COARSE_LOCATION是用于基站定位的时候用的,没有这个权限,在获取getCellLocation的时候报错。

 

第一种方式通过JASON来实现,是通过基站方式的,实现定位的代码

/** 
  * Google定位的实现.
 * Geolocation的详细信息请参见:
 *  * http://code.google.com/apis/gears/geolocation_network_protocol.html  */   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来定位,这里引用代码


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();
                     IterableallSatellites = gpsstatus.getSatellites();   
                     Iteratorit=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");
         }
     };
 }


第三种主要是通过网络的方式来定位,代码


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();
            Listlist = 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");
         }
     };
 }



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭