也許是之前我用GPS程式碼是效率較低的方式,因此重新研究GPS的程式,如果有原理之類的說明也寫在這邊,如果有測試結果也寫在這邊。
使用requestLocationUpdates可以在GPS座標有移動時進行更新,而且只要短短的幾行程式就能辦到,不用寫timer之類的東西,這是2.X版就有的功能,這裡再測試整理如下,可以直接放在主頁面,以下是程式碼:
這篇同步放在這邊:
https://whitecat2.blogspot.com/2018/12/android-gps.html
這裡是宣告全域變數,不宣告全域變數或許比較好,現在先這麼寫。gpsON這個變數也是先放在這邊,這是因為這個程式在關閉時還是會執行gps,另一種方式是在程式關閉時同時關閉gps,也是先用這個方式處理,有時間再訂正
private double locationX = 0.0; private double locationY = 0.0; boolean gpsON = false; LocationManager mlocationManager;
這段程式放在onCreate。其中requestLocationUpdates函式的3000=3秒,0是最小單位長度,一般是愈小愈準,但也會比較耗電。
mlocationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_COARSE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(false);//設置允許產生資費
criteria.setPowerRequirement(Criteria.POWER_LOW);
String provider = mlocationManager.getBestProvider(criteria, false);
Location location = mlocationManager.getLastKnownLocation(provider);
updateLocation(location);
mlocationManager.requestLocationUpdates(provider, 3000, 0, locationListener);
gpsON = true;
2017/03/16:
紅色的部份建議在6.0以上的版本要這麼寫:
//詢問是否存取位置資訊 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions( this, new String[] { Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 1 ); }else{ Location location = mlocationManager.getLastKnownLocation(provider); updateLocation(location); mlocationManager.requestLocationUpdates(provider, 3000, 0, locationListener); }
放在副程式的區段,這邊除了updateLocation副程式,
上面的requestLocationUpdates會在固定時間找gps,
如果位置有變動就會執行onLocationChanged
在程式執行的時候會透過toast顯示現在方位,偵測到移動之後會顯示新的地點數據
private void updateLocation(Location location) { if (location != null) { locationX = location.getLatitude(); locationY = location.getLongitude(); } else { locationX = 0.0; locationY = 0.0; } //背景執行時關閉顯示地點 if(gpsON == true){ Toast.makeText(MainActivity.this, "" + "x:" + locationX + " y:" + locationY , Toast.LENGTH_SHORT).show(); } } private final LocationListener locationListener = new LocationListener() { public void onLocationChanged(Location location) { updateLocation(location); } public void onProviderDisabled(String provider){ updateLocation(null); } public void onProviderEnabled(String provider){ } public void onStatusChanged(String provider, int status,Bundle extras){ } };
最後記得要在AndroidManifest.xml加上下面的程式碼,主要是GPS和network
基本上<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />這就足夠了,
基餘的都是多加上去的
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_GPS" />
以上是android的GPS程式碼的大概內容,主要是寫給自己看的,比較容易找到資料。