使用requestLocationUpdates可以在GPS座標有移動時進行更新,而且只要短短的幾行程式就能辦到,不用寫timer之類的東西,這是2.X版就有的功能,這裡再測試整理如下,可以直接放在主頁面,以下是程式碼:
這裡是宣告全域變數,不宣告全域變數或許比較好,現在先這麼寫。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;
217/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
基本上
基餘的都是多加上去的
以上是android的GPS程式碼的大概內容,主要是寫給自己看的,比較容易找到資料。
沒有留言:
張貼留言