入门资料参考:


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

public class GpsActivity extends Activity {    private EditText editText;    private TextView logText;    private LocationManager lm;    private static final String TAG="GpsActivity"; @Override protected void onDestroy() {  // TODO Auto-generated method stub  super.onDestroy();  lm.removeUpdates(locationListener); } private void setLog(String txt){ printTime(); setLogInfo(txt); }  private void setLogInfo(String txt){ logText.setText(txt+"\n"+"--------------------\n"+logText.getText()); }  private void printTime(){ Calendar ca = Calendar.getInstance();     int year = ca.get(Calendar.YEAR);//获取年份     int month=ca.get(Calendar.MONTH);//获取月份      int day=ca.get(Calendar.DATE);//获取日     int minute=ca.get(Calendar.MINUTE);//分      int hour=ca.get(Calendar.HOUR);//小时      int second=ca.get(Calendar.SECOND);//秒     int WeekOfYear = ca.get(Calendar.DAY_OF_WEEK);                setLogInfo("当前日期:" + year +"年"+ month +"月"+ day + "日");     setLogInfo(">>>" + hour +"时"+ minute +"分"+ second +"秒"); }     @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.gps_demo);                editText=(EditText)findViewById(R.id.editText);        logText=(TextView) this.findViewById(R.id.logText);                        lm=(LocationManager)getSystemService(Context.LOCATION_SERVICE);                //判断GPS是否正常启动        if(!lm.isProviderEnabled(LocationManager.GPS_PROVIDER)){            Toast.makeText(this, "请开启GPS导航...", Toast.LENGTH_SHORT).show();            setLog("请开启GPS导航...");            //返回开启GPS导航设置界面            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);               startActivityForResult(intent,0);             return;        }                //为获取地理位置信息时设置查询条件        String bestProvider = lm.getBestProvider(getCriteria(), true);        //获取位置信息        //如果不设置查询要求,getLastKnownLocation方法传人的参数为LocationManager.GPS_PROVIDER        Location location= lm.getLastKnownLocation(bestProvider);            updateView(location);        //监听状态        lm.addGpsStatusListener(listener);        //绑定监听,有4个参数            //参数1,设备:有GPS_PROVIDER和NETWORK_PROVIDER两种        //参数2,位置信息更新周期,单位毫秒            //参数3,位置变化最小距离:当位置距离变化超过此值时,将更新位置信息            //参数4,监听            //备注:参数2和3,如果参数3不为0,则以参数3为准;参数3为0,则通过时间来定时更新;两者为0,则随时刷新                   // 1秒更新一次,或最小位移变化超过1米更新一次;        //注意:此处更新准确度非常低,推荐在service里面启动一个Thread,在run中sleep(10000);然后执行handler.sendMessage(),更新位置        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, locationListener);    }        //位置监听    private LocationListener locationListener=new LocationListener() {                /**         * 位置信息变化时触发         */        public void onLocationChanged(Location location) {            updateView(location);            Log.i(TAG, "时间:"+location.getTime());             Log.i(TAG, "经度:"+location.getLongitude());             Log.i(TAG, "纬度:"+location.getLatitude());             Log.i(TAG, "海拔:"+location.getAltitude());                                     setLog( "时间:"+location.getTime());            setLog( "经度:"+location.getLongitude());            setLog( "纬度:"+location.getLatitude());            setLog( "海拔:"+location.getAltitude());        }                /**         * GPS状态变化时触发         */        public void onStatusChanged(String provider, int status, Bundle extras) {            switch (status) {            //GPS状态为可见时            case LocationProvider.AVAILABLE:                Log.i(TAG, "当前GPS状态为可见状态");                                setLog("当前GPS状态为可见状态");                break;            //GPS状态为服务区外时            case LocationProvider.OUT_OF_SERVICE:                Log.i(TAG, "当前GPS状态为服务区外状态");                setLog("当前GPS状态为服务区外状态");                break;            //GPS状态为暂停服务时            case LocationProvider.TEMPORARILY_UNAVAILABLE:                Log.i(TAG, "当前GPS状态为暂停服务状态");                setLog("当前GPS状态为暂停服务状态");                break;            }        }            /**         * GPS开启时触发         */        public void onProviderEnabled(String provider) {            Location location=lm.getLastKnownLocation(provider);            updateView(location);        }            /**         * GPS禁用时触发         */        public void onProviderDisabled(String provider) {            updateView(null);        }        };        //状态监听    GpsStatus.Listener listener = new GpsStatus.Listener() {        public void onGpsStatusChanged(int event) {            switch (event) {            //第一次定位            case GpsStatus.GPS_EVENT_FIRST_FIX:                Log.i(TAG, "第一次定位");                setLog("第一次定位");                break;            //卫星状态改变            case GpsStatus.GPS_EVENT_SATELLITE_STATUS:                Log.i(TAG, "卫星状态改变");                setLog("卫星状态改变");                //获取当前状态                GpsStatus gpsStatus=lm.getGpsStatus(null);                //获取卫星颗数的默认最大值                int maxSatellites = gpsStatus.getMaxSatellites();                //创建一个迭代器保存所有卫星                 Iterator<GpsSatellite> iters = gpsStatus.getSatellites().iterator();                int count = 0;                     while (iters.hasNext() && count <= maxSatellites) {                         GpsSatellite s = iters.next();                         count++;                     }                   System.out.println("搜索到:"+count+"颗卫星");                setLog("搜索到:"+count+"颗卫星");                break;            //定位启动            case GpsStatus.GPS_EVENT_STARTED:                Log.i(TAG, "定位启动");                setLog("定位启动");                break;            //定位结束            case GpsStatus.GPS_EVENT_STOPPED:                Log.i(TAG, "定位结束");                setLog("定位结束");                break;            }        };    };        /**     * 实时更新文本内容     *      * @param location     */    private void updateView(Location location){        if(location!=null){            editText.setText("设备位置信息\n\n经度:");            editText.append(String.valueOf(location.getLongitude()));            editText.append("\n纬度:");            editText.append(String.valueOf(location.getLatitude()));        }else{            //清空EditText对象            editText.getEditableText().clear();        }    }        /**     * 返回查询条件     * @return     */    private Criteria getCriteria(){        Criteria criteria=new Criteria();        //设置定位精确度 Criteria.ACCURACY_COARSE比较粗略,Criteria.ACCURACY_FINE则比较精细         criteria.setAccuracy(Criteria.ACCURACY_FINE);            //设置是否要求速度        criteria.setSpeedRequired(false);        // 设置是否允许运营商收费          criteria.setCostAllowed(false);        //设置是否需要方位信息        criteria.setBearingRequired(false);        //设置是否需要海拔信息        criteria.setAltitudeRequired(false);        // 设置对电源的需求          criteria.setPowerRequirement(Criteria.POWER_LOW);        return criteria;    }}

然后在layout目录创建 gps_demo.xml

<?xml version="1.0" encoding="utf-8"?>    <ScrollView        android:layout_width="fill_parent"        android:layout_height="fill_parent"        xmlns:android="http://schemas.android.com/apk/res/android"        ><LinearLayout     android:orientation="vertical"    android:layout_width="fill_parent"    android:layout_height="fill_parent">    <EditText android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:cursorVisible="false"        android:editable="false"        android:id="@+id/editText"/>   <TextView android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:minHeight="300dp"                android:id="@+id/logText"/></LinearLayout>   </ScrollView>


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

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>



手机运行的效果图




注意事项:

1、室内是无法检测到GPS信号的,如果你获得了经纬度,那也是最后一次手机缓存的GPS记录。

2、你获得gps偏移量大的问题,请参照 关于GPS偏移的基础知识



作者:changemyself 发表于2013-8-2 11:37:59 原文链接 阅读:0 评论:0 查看评论

更多相关文章

  1. android中gridView中点击 item为选中状态
  2. android 获取手机设备信息
  3. Android(安卓)SDK自带教程之BluetoothChat
  4. android 实时检测网络状态
  5. Android中隐藏标题栏和状态栏
  6. android TelephonyManager
  7. android屏幕监听,手机是否处于锁屏状态,在锁屏之上弹出Toast.makeT
  8. mybatisplus的坑 insert标签insert into select无参数问题的解决
  9. Python技巧匿名函数、回调函数和高阶函数

随机推荐

  1. java堆栈
  2. Python中tuple和list有什么区别?Python入
  3. PHP类报错怎么办?
  4. Linux高阶命令使用
  5. 【胖猴小玩闹】智能门锁与网关:云丁鹿客智
  6. MySQL主从之master_info_repository与syn
  7. js基础知识:变量与常量,函数及参数
  8. 复制远程服务器文件命令scp的使用
  9. 【JS基础入门】JavaScript原生Ajax请求与
  10. dom树元素的增删改查