1 public class Main extends Activity implements OnClickListener { 2 private LocationManager locationManager; 3 private Location location; 4 private Criteria criteria; 5 private String provider; 6 7 private TextView tv_Latitude;// 纬度 8 private TextView tv_Longitude;// 经度 9 private TextView tv_High;// 海拔 10 private TextView tv_Direction;// 方向 11 private TextView tv_Speed;// 速度 12 private TextView tv_GpsTime;// 获取的时间 13 private TextView tv_InfoType;// 信息的来源 14 private EditText et_SetTimeSpace;// 设置时间间隔 15 16 private Button manual_btn; 17 private Button settimespace_btn; 18 private Button exit_btn; 19 20 public void onCreate(Bundle savedInstanceState) { 21 super.onCreate(savedInstanceState); 22 setContentView(R.layout.main); 23 setTitle("GPS"); 24 // 隐藏输入法 25 getWindow().setSoftInputMode( 26 WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 27 initView(); 28 initLocation(); 29 } 30 31 // 初始化 32 @SuppressWarnings("static-access") 33 private void initLocation() { 34 // 初始化locationManager:获得系统所提供的location_service 35 locationManager = (LocationManager) getSystemService(this.LOCATION_SERVICE); 36 /** 37 * LocationManager.GPS_PROVIDER 38 * 39 * 精度比较高,但是慢而且消耗电力, 而且可能因为天气原因或者障碍物而无法获取卫星信息,另外设备可能没有GPS模块; 40 * LocationManager.NETWORK_PROVIDER 41 * 42 * 通过网络获取定位信息,精度低,耗电少,获取信息速度较快,不依赖GPS模块。 43 */ 44 if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 45 /* 注意:criteria有多种设置 */ 46 47 // 第一种:criteria 48 criteria = new Criteria(); 49 criteria.setAccuracy(Criteria.ACCURACY_FINE);// 高精度 50 criteria.setAltitudeRequired(true);// 显示海拔 51 criteria.setBearingRequired(true);// 显示方向 52 criteria.setSpeedRequired(true);// 显示速度 53 criteria.setCostAllowed(false);// 不允许有花费 54 criteria.setPowerRequirement(Criteria.POWER_LOW);// 低功耗 55 56 // 第二种:criteria 57 // criteria = new Criteria(); 58 // criteria.setAccuracy(Criteria.ACCURACY_FINE);//设置为最大精度 59 // criteria.setAltitudeRequired(false);//不要求海拔信息 60 // criteria.setBearingRequired(false);//不要求方位信息 61 // criteria.setCostAllowed(true);//是否允许付费 62 // criteria.setPowerRequirement(Criteria.POWER_LOW);//对电量的要求 63 64 provider = locationManager.getBestProvider(criteria, true); 65 66 locationManager.requestLocationUpdates(provider, 5000, 10, 67 locationListener);// 位置变化监听,默认5秒一次,距离10米以上 68 } else 69 showInfo(null, -1); 70 } 71 72 /** 73 * 获取GPS相应的数据 74 * 75 * @return 76 */ 77 private GPSModel getLastPosition() { 78 GPSModel gpsModel = new GPSModel(); 79 location = locationManager.getLastKnownLocation(provider); 80 if (location != null) { 81 gpsModel.Latitude = (double) (location.getLatitude()); 82 gpsModel.Longitude = (double) (location.getLongitude()); 83 gpsModel.High = location.getAltitude(); 84 gpsModel.Direct = location.getBearing(); 85 gpsModel.Speed = location.getSpeed(); 86 87 Date d = new Date(); 88 d.setTime(location.getTime()); 89 gpsModel.GpsTime = DateFormat.format("yyyy-MM-dd kk:mm:ss", d) 90 .toString(); 91 d = null; 92 } 93 return gpsModel; 94 } 95 96 // 显示信息 97 private void showInfo(GPSModel gpsModel, int infotype) { 98 if (gpsModel == null) { 99 if (infotype == -1) { 100 tv_Latitude.setText("GPS功能已关闭"); 101 tv_Longitude.setText(""); 102 tv_High.setText(""); 103 tv_Direction.setText(""); 104 tv_Speed.setText(""); 105 tv_GpsTime.setText(""); 106 tv_InfoType.setText(""); 107 manual_btn.setEnabled(false); 108 settimespace_btn.setEnabled(false); 109 et_SetTimeSpace.setEnabled(false); 110 } 111 } else { 112 double y = gpsModel.Latitude;// 纬度 113 double x = gpsModel.Longitude;// 经度 114 tv_Latitude.setText("纬度:y=" + String.valueOf(y)); 115 tv_Longitude.setText("经度:x=" + String.valueOf(x)); 116 tv_High.setText(String.format("海拔:%f", gpsModel.High)); 117 tv_Direction.setText(String.format("方向:%f", gpsModel.Direct)); 118 tv_Speed.setText(String.format("速度:%f", gpsModel.Speed)); 119 tv_GpsTime.setText(String.format("GPS时间:%s", gpsModel.GpsTime)); 120 121 gpsModel.InfoType = infotype; 122 switch (infotype) { 123 case 1: 124 tv_InfoType.setText("信息来源状态:手动获取更新"); 125 break; 126 case 2: 127 tv_InfoType.setText("信息来源状态:位置改变更新"); 128 break; 129 } 130 } 131 132 } 133 134 @SuppressWarnings("static-access") 135 @Override 136 public void onClick(View v) { 137 if (v.equals(manual_btn)) { 138 showInfo(getLastPosition(), 1); 139 } 140 if (v.equals(settimespace_btn)) { 141 if (TextUtils.isEmpty(et_SetTimeSpace.getText().toString())) { 142 Toast.makeText(this, "请输入更新时间间隔", Toast.LENGTH_LONG).show(); 143 et_SetTimeSpace.requestFocus(); 144 return; 145 } 146 147 int timespace = Integer.valueOf(et_SetTimeSpace.getText() 148 .toString()) * 1000; 149 if (locationManager.isProviderEnabled(locationManager.GPS_PROVIDER)) 150 locationManager.requestLocationUpdates(provider, timespace, 10, 151 locationListener); 152 } 153 if (v.equals(exit_btn)) 154 android.os.Process.killProcess(android.os.Process.myPid()); 155 } 156 157 private final LocationListener locationListener = new LocationListener() { 158 159 @Override 160 public void onLocationChanged(Location arg0) { 161 showInfo(getLastPosition(), 2); 162 } 163 164 @Override 165 public void onProviderDisabled(String arg0) { 166 showInfo(null, -1); 167 } 168 169 @Override 170 public void onProviderEnabled(String arg0) { 171 } 172 173 @Override 174 public void onStatusChanged(String arg0, int arg1, Bundle arg2) { 175 } 176 177 }; 178 179 private void initView() { 180 tv_Latitude = (TextView) findViewById(R.id.tvlatitude); 181 tv_Longitude = (TextView) findViewById(R.id.tvlongitude); 182 tv_High = (TextView) findViewById(R.id.tvhigh); 183 tv_Direction = (TextView) findViewById(R.id.tvdirection); 184 tv_Speed = (TextView) findViewById(R.id.tvspeed); 185 tv_GpsTime = (TextView) findViewById(R.id.tvgpstime); 186 tv_InfoType = (TextView) findViewById(R.id.tvinfotype); 187 et_SetTimeSpace = (EditText) findViewById(R.id.ettimespace); 188 189 manual_btn = (Button) findViewById(R.id.btnmanual); 190 manual_btn.setOnClickListener(this); 191 settimespace_btn = (Button) findViewById(R.id.btnsettimespace); 192 settimespace_btn.setOnClickListener(this); 193 exit_btn = (Button) findViewById(R.id.btnexit); 194 exit_btn.setOnClickListener(this); 195 } 196 197 }