android gps开发必备资料

来源:互联网 发布:有淘宝就能贷款的软件 编辑:程序博客网 时间:2024/05/17 23:36

入门资料参考:


How accurate is Android GPS? Part 1: Understanding Location Data


How accurate is Android GPS? Part 2 – Consuming real-time locations


Google Developer docs – Location Strategies

Android blog – Deep dive into location

GPS Testing Tool (open source)

HTML5 Geolocation API – How accurate is it, really?



测试demo工程:

GpsActivty.java

[java] view plaincopyprint?
  1. public class GpsActivity extends Activity {  
  2.     private EditText editText;  
  3.     private TextView logText;  
  4.     private LocationManager lm;  
  5.     private static final String TAG="GpsActivity";  
  6.      @Override  
  7.      protected void onDestroy() {  
  8.       // TODO Auto-generated method stub  
  9.       super.onDestroy();  
  10.       lm.removeUpdates(locationListener);  
  11.      }  
  12.   
  13.   
  14.  private void setLog(String txt){  
  15.      printTime();  
  16.      setLogInfo(txt);  
  17.  }  
  18.    
  19.  private void setLogInfo(String txt){  
  20.      logText.setText(txt+"\n"+"--------------------\n"+logText.getText());  
  21.  }  
  22.    
  23.  private void printTime(){  
  24.      Calendar ca = Calendar.getInstance();  
  25.      int year = ca.get(Calendar.YEAR);//获取年份  
  26.      int month=ca.get(Calendar.MONTH);//获取月份   
  27.      int day=ca.get(Calendar.DATE);//获取日  
  28.      int minute=ca.get(Calendar.MINUTE);//分   
  29.      int hour=ca.get(Calendar.HOUR);//小时   
  30.      int second=ca.get(Calendar.SECOND);//秒  
  31.      int WeekOfYear = ca.get(Calendar.DAY_OF_WEEK);   
  32.        
  33.        
  34.      setLogInfo("当前日期:" + year +"年"+ month +"月"+ day + "日");  
  35.      setLogInfo(">>>" + hour +"时"+ minute +"分"+ second +"秒");  
  36.  }  
  37.    
  38.     @Override  
  39.     public void onCreate(Bundle savedInstanceState) {  
  40.         super.onCreate(savedInstanceState);  
  41.         setContentView(R.layout.gps_demo);  
  42.           
  43.         editText=(EditText)findViewById(R.id.editText);  
  44.         logText=(TextView) this.findViewById(R.id.logText);  
  45.           
  46.           
  47.         lm=(LocationManager)getSystemService(Context.LOCATION_SERVICE);  
  48.           
  49.         //判断GPS是否正常启动  
  50.         if(!lm.isProviderEnabled(LocationManager.GPS_PROVIDER)){  
  51.             Toast.makeText(this"请开启GPS导航...", Toast.LENGTH_SHORT).show();  
  52.             setLog("请开启GPS导航...");  
  53.             //返回开启GPS导航设置界面  
  54.             Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);     
  55.             startActivityForResult(intent,0);   
  56.             return;  
  57.         }  
  58.           
  59.         //为获取地理位置信息时设置查询条件  
  60.         String bestProvider = lm.getBestProvider(getCriteria(), true);  
  61.         //获取位置信息  
  62.         //如果不设置查询要求,getLastKnownLocation方法传人的参数为LocationManager.GPS_PROVIDER  
  63.         Location location= lm.getLastKnownLocation(bestProvider);      
  64.         updateView(location);  
  65.         //监听状态  
  66.         lm.addGpsStatusListener(listener);  
  67.         //绑定监听,有4个参数      
  68.         //参数1,设备:有GPS_PROVIDER和NETWORK_PROVIDER两种  
  69.         //参数2,位置信息更新周期,单位毫秒      
  70.         //参数3,位置变化最小距离:当位置距离变化超过此值时,将更新位置信息      
  71.         //参数4,监听      
  72.         //备注:参数2和3,如果参数3不为0,则以参数3为准;参数3为0,则通过时间来定时更新;两者为0,则随时刷新     
  73.           
  74.         // 1秒更新一次,或最小位移变化超过1米更新一次;  
  75.         //注意:此处更新准确度非常低,推荐在service里面启动一个Thread,在run中sleep(10000);然后执行handler.sendMessage(),更新位置  
  76.         lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10001, locationListener);  
  77.     }  
  78.       
  79.     //位置监听  
  80.     private LocationListener locationListener=new LocationListener() {  
  81.           
  82.         /** 
  83.          * 位置信息变化时触发 
  84.          */  
  85.         public void onLocationChanged(Location location) {  
  86.             updateView(location);  
  87.             Log.i(TAG, "时间:"+location.getTime());   
  88.             Log.i(TAG, "经度:"+location.getLongitude());   
  89.             Log.i(TAG, "纬度:"+location.getLatitude());   
  90.             Log.i(TAG, "海拔:"+location.getAltitude());   
  91.               
  92.               
  93.             setLog( "时间:"+location.getTime());  
  94.             setLog( "经度:"+location.getLongitude());  
  95.             setLog( "纬度:"+location.getLatitude());  
  96.             setLog( "海拔:"+location.getAltitude());  
  97.         }  
  98.           
  99.         /** 
  100.          * GPS状态变化时触发 
  101.          */  
  102.         public void onStatusChanged(String provider, int status, Bundle extras) {  
  103.             switch (status) {  
  104.             //GPS状态为可见时  
  105.             case LocationProvider.AVAILABLE:  
  106.                 Log.i(TAG, "当前GPS状态为可见状态");  
  107.                   
  108.                 setLog("当前GPS状态为可见状态");  
  109.                 break;  
  110.             //GPS状态为服务区外时  
  111.             case LocationProvider.OUT_OF_SERVICE:  
  112.                 Log.i(TAG, "当前GPS状态为服务区外状态");  
  113.                 setLog("当前GPS状态为服务区外状态");  
  114.                 break;  
  115.             //GPS状态为暂停服务时  
  116.             case LocationProvider.TEMPORARILY_UNAVAILABLE:  
  117.                 Log.i(TAG, "当前GPS状态为暂停服务状态");  
  118.                 setLog("当前GPS状态为暂停服务状态");  
  119.                 break;  
  120.             }  
  121.         }  
  122.       
  123.         /** 
  124.          * GPS开启时触发 
  125.          */  
  126.         public void onProviderEnabled(String provider) {  
  127.             Location location=lm.getLastKnownLocation(provider);  
  128.             updateView(location);  
  129.         }  
  130.       
  131.         /** 
  132.          * GPS禁用时触发 
  133.          */  
  134.         public void onProviderDisabled(String provider) {  
  135.             updateView(null);  
  136.         }  
  137.   
  138.       
  139.     };  
  140.       
  141.     //状态监听  
  142.     GpsStatus.Listener listener = new GpsStatus.Listener() {  
  143.         public void onGpsStatusChanged(int event) {  
  144.             switch (event) {  
  145.             //第一次定位  
  146.             case GpsStatus.GPS_EVENT_FIRST_FIX:  
  147.                 Log.i(TAG, "第一次定位");  
  148.                 setLog("第一次定位");  
  149.                 break;  
  150.             //卫星状态改变  
  151.             case GpsStatus.GPS_EVENT_SATELLITE_STATUS:  
  152.                 Log.i(TAG, "卫星状态改变");  
  153.                 setLog("卫星状态改变");  
  154.                 //获取当前状态  
  155.                 GpsStatus gpsStatus=lm.getGpsStatus(null);  
  156.                 //获取卫星颗数的默认最大值  
  157.                 int maxSatellites = gpsStatus.getMaxSatellites();  
  158.                 //创建一个迭代器保存所有卫星   
  159.                 Iterator<GpsSatellite> iters = gpsStatus.getSatellites().iterator();  
  160.                 int count = 0;       
  161.                 while (iters.hasNext() && count <= maxSatellites) {       
  162.                     GpsSatellite s = iters.next();       
  163.                     count++;       
  164.                 }     
  165.                 System.out.println("搜索到:"+count+"颗卫星");  
  166.                 setLog("搜索到:"+count+"颗卫星");  
  167.                 break;  
  168.             //定位启动  
  169.             case GpsStatus.GPS_EVENT_STARTED:  
  170.                 Log.i(TAG, "定位启动");  
  171.                 setLog("定位启动");  
  172.                 break;  
  173.             //定位结束  
  174.             case GpsStatus.GPS_EVENT_STOPPED:  
  175.                 Log.i(TAG, "定位结束");  
  176.                 setLog("定位结束");  
  177.                 break;  
  178.             }  
  179.         };  
  180.     };  
  181.       
  182.     /** 
  183.      * 实时更新文本内容 
  184.      *  
  185.      * @param location 
  186.      */  
  187.     private void updateView(Location location){  
  188.         if(location!=null){  
  189.             editText.setText("设备位置信息\n\n经度:");  
  190.             editText.append(String.valueOf(location.getLongitude()));  
  191.             editText.append("\n纬度:");  
  192.             editText.append(String.valueOf(location.getLatitude()));  
  193.         }else{  
  194.             //清空EditText对象  
  195.             editText.getEditableText().clear();  
  196.         }  
  197.     }  
  198.       
  199.     /** 
  200.      * 返回查询条件 
  201.      * @return 
  202.      */  
  203.     private Criteria getCriteria(){  
  204.         Criteria criteria=new Criteria();  
  205.         //设置定位精确度 Criteria.ACCURACY_COARSE比较粗略,Criteria.ACCURACY_FINE则比较精细   
  206.         criteria.setAccuracy(Criteria.ACCURACY_FINE);      
  207.         //设置是否要求速度  
  208.         criteria.setSpeedRequired(false);  
  209.         // 设置是否允许运营商收费    
  210.         criteria.setCostAllowed(false);  
  211.         //设置是否需要方位信息  
  212.         criteria.setBearingRequired(false);  
  213.         //设置是否需要海拔信息  
  214.         criteria.setAltitudeRequired(false);  
  215.         // 设置对电源的需求    
  216.         criteria.setPowerRequirement(Criteria.POWER_LOW);  
  217.         return criteria;  
  218.     }  
  219. }  

然后在layout目录创建 gps_demo.xml

[javascript] view plaincopyprint?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2.     <ScrollView  
  3.         android:layout_width="fill_parent"  
  4.         android:layout_height="fill_parent"  
  5.         xmlns:android="http://schemas.android.com/apk/res/android"  
  6.         >  
  7. <LinearLayout   
  8.     android:orientation="vertical"  
  9.     android:layout_width="fill_parent"  
  10.     android:layout_height="fill_parent">  
  11.     <EditText android:layout_width="fill_parent"  
  12.         android:layout_height="wrap_content"  
  13.         android:cursorVisible="false"  
  14.         android:editable="false"  
  15.         android:id="@+id/editText"/>  
  16.   
  17.    <TextView android:layout_width="fill_parent"  
  18.         android:layout_height="wrap_content"  
  19.         android:minHeight="300dp"  
  20.           
  21.         android:id="@+id/logText"/>  
  22.   
  23. </LinearLayout>  
  24.    </ScrollView>  


最后在AndroidManifest.xml里添加需要的权限

[javascript] view plaincopyprint?
  1. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>  



手机运行的效果图



0 0
原创粉丝点击