也許是之前我用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程式碼的大概內容,主要是寫給自己看的,比較容易找到資料。

arrow
arrow
    文章標籤
    android GPS 程式碼
    全站熱搜

    貓羽 發表在 痞客邦 留言(2) 人氣()