1 package com.jasgroup.cn.amhdeam; 2 3 import java.io.IOException; 4 import java.util.Iterator; 5 6 import android.Manifest; 7 import android.app.Activity; 8 import android.content.Context; 9 import android.content.Intent; 10 import android.content.pm.ActivityInfo; 11 import android.content.pm.PackageManager; 12 import android.location.Criteria; 13 import android.location.GpsSatellite; 14 import android.location.GpsStatus; 15 import android.location.Location; 16 import android.location.LocationListener; 17 import android.location.LocationManager; 18 import android.location.LocationProvider; 19 import android.os.Bundle; 20 import android.provider.Settings; 21 import android.support.v4.app.ActivityCompat; 22 import android.util.Log; 23 import android.view.WindowManager; 24 import android.widget.EditText; 25 import android.widget.LinearLayout; 26 import android.widget.Toast; 27 28 import com.esri.android.map.GraphicsLayer; 29 import com.esri.android.map.Layer; 30 import com.esri.android.map.MapView; 31 import com.esri.android.map.ags.ArcGISDynamicMapServiceLayer; 32 import com.esri.core.geometry.Envelope; 33 import com.esri.core.geometry.Point; 34 import com.esri.core.geometry.SpatialReference; 35 import com.esri.core.map.Graphic; 36 import com.esri.core.symbol.PictureMarkerSymbol; 37 38 import org.xmlpull.v1.XmlPullParserException; 39 40 public class GpsActivity extends Activity { 41 private EditText editText; 42 private LocationManager lm; 43 private GraphicsLayer graphicsLayer = null; 44 private String latitude; 45 private String longitude; 46 private String ip = null; 47 private String port = null; 48 private String userid = null; 49 private MapView mMapView; 50 private LinearLayout linearLayout; 51 private Layer layer; 52 private static final String TAG = "GpsActivity"; 53 54 @Override 55 protected void onDestroy() { 56 // TODO Auto-generated method stub 57 super.onDestroy(); 58 // lm.removeUpdates(locationListener); 59 } 60 61 62 @Override 63 public void onCreate(Bundle savedInstanceState) { 64 super.onCreate(savedInstanceState); 65 66 setContentView(R.layout.locationutil); 67 68 editText = (EditText) findViewById(R.id.editText); 69 lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 70 SpatialReference S = SpatialReference.create(4326); 71 Envelope envelope = new Envelope(62.938320359601796, 37.37854569628149, 66.4928652149837, 39.6757739604943); 72 mMapView = new MapView(this, S, envelope); 73 74 // mMapView = (MapView) findViewById(R.id.map); 75 76 mMapView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT)); 77 //添加地圖 78 layer = new ArcGISDynamicMapServiceLayer("http://192.168.20.180:6080/arcgis/rest/services/gongquAB/MapServer"); 79 mMapView.addLayer(layer); 80 mMapView.setExtent(envelope); 81 graphicsLayer = new GraphicsLayer(); 82 mMapView.addLayer(graphicsLayer); 83 setContentView(mMapView); 84 /* 85 接受端口信息 86 */ 87 Bundle bundle = this.getIntent().getExtras(); 88 if (bundle != null) { 89 userid = bundle.getString("userid"); 90 ip = bundle.getString("ip"); 91 port = bundle.getString("port"); 92 } 93 // tv = (TextView) findViewById(R.id.tv); 94 // mMapView = (MapView) findViewById(R.id.map); 95 linearLayout = (LinearLayout) findViewById(R.id.llMap); 96 97 //判斷GPS是否正常啟動 98 if (!lm.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 99 Toast.makeText(this, "請開啟GPS導航...", Toast.LENGTH_SHORT).show(); 100 //返回開啟GPS導航設置界面 101 Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 102 startActivityForResult(intent, 0); 103 return; 104 } 105 106 //為獲取地理位置信息時設置查詢條件 107 String bestProvider = lm.getBestProvider(getCriteria(), true); 108 //獲取位置信息 109 //如果不設置查詢要求,getLastKnownLocation方法傳人的參數為LocationManager.GPS_PROVIDER 110 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 111 112 return; 113 } 114 Location location = lm.getLastKnownLocation(bestProvider); 115 updateToNewLocation(location); 116 //監聽狀態 117 lm.addGpsStatusListener(listener); 118 //綁定監聽,有4個參數 119 //參數1,設備:有GPS_PROVIDER和NETWORK_PROVIDER兩種 120 //參數2,位置信息更新周期,單位毫秒 121 //參數3,位置變化最小距離:當位置距離變化超過此值時,將更新位置信息 122 //參數4,監聽 123 //備注:參數2和3,如果參數3不為0,則以參數3為准;參數3為0,則通過時間來定時更新;兩者為0,則隨時刷新 124 125 // 1秒更新一次,或最小位移變化超過1米更新一次; 126 //注意:此處更新准確度非常低,推薦在service里面啟動一個Thread,在run中sleep(10000);然后執行handler.sendMessage(),更新位置 127 lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, locationListener); 128 } 129 130 @Override 131 protected void onResume() { 132 /** 133 * 設置為橫屏 134 */ 135 if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) { 136 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 137 138 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 139 140 return; 141 } 142 lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, 143 locationListener); 144 } 145 super.onResume(); 146 }; 147 148 //位置監聽 149 private LocationListener locationListener = new LocationListener() { 150 151 /** 152 * 位置信息變化時觸發 153 */ 154 public void onLocationChanged(Location location) { 155 updateToNewLocation(location); 156 Log.i(TAG, "時間:" + location.getTime()); 157 Log.i(TAG, "經度:" + location.getLongitude()); 158 Log.i(TAG, "緯度:" + location.getLatitude()); 159 Log.i(TAG, "海拔:" + location.getAltitude()); 160 } 161 162 /** 163 * GPS狀態變化時觸發 164 */ 165 public void onStatusChanged(String provider, int status, Bundle extras) { 166 switch (status) { 167 //GPS狀態為可見時 168 case LocationProvider.AVAILABLE: 169 Log.i(TAG, "當前GPS狀態為可見狀態"); 170 break; 171 //GPS狀態為服務區外時 172 case LocationProvider.OUT_OF_SERVICE: 173 Log.i(TAG, "當前GPS狀態為服務區外狀態"); 174 break; 175 //GPS狀態為暫停服務時 176 case LocationProvider.TEMPORARILY_UNAVAILABLE: 177 Log.i(TAG, "當前GPS狀態為暫停服務狀態"); 178 break; 179 } 180 } 181 182 /** 183 * GPS開啟時觸發 184 */ 185 public void onProviderEnabled(String provider) { 186 if (ActivityCompat.checkSelfPermission(GpsActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(GpsActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 187 // TODO: Consider calling 188 // ActivityCompat#requestPermissions 189 // here to request the missing permissions, and then overriding 190 // public void onRequestPermissionsResult(int requestCode, String[] permissions, 191 // int[] grantResults) 192 // to handle the case where the user grants the permission. See the documentation 193 // for ActivityCompat#requestPermissions for more details. 194 return; 195 } 196 Location location = lm.getLastKnownLocation(provider); 197 updateView(location); 198 } 199 200 /** 201 * GPS禁用時觸發 202 */ 203 public void onProviderDisabled(String provider) { 204 updateView(null); 205 } 206 207 208 }; 209 210 //狀態監聽 211 GpsStatus.Listener listener = new GpsStatus.Listener() { 212 public void onGpsStatusChanged(int event) { 213 switch (event) { 214 //第一次定位 215 case GpsStatus.GPS_EVENT_FIRST_FIX: 216 Log.i(TAG, "第一次定位"); 217 break; 218 //衛星狀態改變 219 case GpsStatus.GPS_EVENT_SATELLITE_STATUS: 220 Log.i(TAG, "衛星狀態改變"); 221 //獲取當前狀態 222 if (ActivityCompat.checkSelfPermission(GpsActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 223 // TODO: Consider calling 224 // ActivityCompat#requestPermissions 225 // here to request the missing permissions, and then overriding 226 // public void onRequestPermissionsResult(int requestCode, String[] permissions, 227 // int[] grantResults) 228 // to handle the case where the user grants the permission. See the documentation 229 // for ActivityCompat#requestPermissions for more details. 230 return; 231 } 232 GpsStatus gpsStatus = lm.getGpsStatus(null); 233 //獲取衛星顆數的默認最大值 234 int maxSatellites = gpsStatus.getMaxSatellites(); 235 //創建一個迭代器保存所有衛星 236 Iterator<GpsSatellite> iters = gpsStatus.getSatellites().iterator(); 237 int count = 0; 238 while (iters.hasNext() && count <= maxSatellites) { 239 GpsSatellite s = iters.next(); 240 count++; 241 } 242 System.out.println("搜索到:"+count+"顆衛星"); 243 break; 244 //定位啟動 245 case GpsStatus.GPS_EVENT_STARTED: 246 Log.i(TAG, "定位啟動"); 247 break; 248 //定位結束 249 case GpsStatus.GPS_EVENT_STOPPED: 250 Log.i(TAG, "定位結束"); 251 break; 252 } 253 }; 254 }; 255 256 /** 257 * 實時更新文本內容 258 * 259 * @param location 260 */ 261 private void updateView(Location location){ 262 if(location!=null){ 263 editText.setText("設備位置信息\n\n經度:"); 264 editText.append(String.valueOf(location.getLongitude())); 265 editText.append("\n緯度:"); 266 editText.append(String.valueOf(location.getLatitude())); 267 }else{ 268 //清空EditText對象 269 editText.getEditableText().clear(); 270 } 271 } 272 273 /** 274 * 返回查詢條件 275 * @return 276 */ 277 private Criteria getCriteria(){ 278 Criteria criteria=new Criteria(); 279 //設置定位精確度 Criteria.ACCURACY_COARSE比較粗略,Criteria.ACCURACY_FINE則比較精細 280 criteria.setAccuracy(Criteria.ACCURACY_FINE); 281 //設置是否要求速度 282 criteria.setSpeedRequired(true); 283 // 設置是否允許運營商收費 284 criteria.setCostAllowed(false); 285 //設置是否需要方位信息 286 criteria.setBearingRequired(false); 287 //設置是否需要海拔信息 288 criteria.setAltitudeRequired(false); 289 // 設置對電源的需求 290 criteria.setPowerRequirement(Criteria.POWER_LOW); 291 return criteria; 292 } 293 private Location updateToNewLocation(Location location) { 294 System.out.println("--------zhixing--2--------"); 295 String latLongString; 296 if (location != null) { 297 //設置當前坐標 298 Point point=new Point(); 299 point.setX(location.getLongitude()); 300 point.setY(location.getLatitude()); 301 PictureMarkerSymbol pictureMarkerSymbol=new PictureMarkerSymbol(getResources().getDrawable(R.drawable.location1)); 302 303 Graphic graphic=new Graphic(point,pictureMarkerSymbol); 304 // Graphic graphic=new Graphic(point,new SimpleMarkerSymbol(Color.RED,25, SimpleMarkerSymbol.STYLE.CIRCLE)); 305 graphicsLayer.addGraphic(graphic);//添加地圖中 306 307 latitude = Double.toString(location.getLatitude()); 308 longitude = Double.toString(location.getLongitude()); 309 latLongString = "緯度:" + latitude + "\n經度:" + longitude; 310 System.out.println("經度:" + longitude + "緯度:" + latitude); 311 sendp(); 312 } else { 313 latLongString = "無法獲取地理信息,請稍后..."; 314 } 315 if(latitude!=null){ 316 System.out.println("--------反饋信息----------"+ String.valueOf(latitude)); 317 } 318 Toast.makeText(getApplicationContext(), latLongString, Toast.LENGTH_SHORT).show(); 319 320 return location; 321 } 322 public void sendp(){ 323 new Thread(){ 324 @Override 325 public void run(){ 326 // while (!exit){ 327 try { 328 AsyncTaskUtil.getData(userid, latitude, longitude, ip, port); 329 330 } catch (IOException e) { 331 e.printStackTrace(); 332 } catch (XmlPullParserException e) { 333 e.printStackTrace(); 334 } 335 } 336 // } 337 }.start(); 338 } 339 }