0

私は現在、次のようなアプリを書いています:

  • UI にはトグル ボタンが 1 つだけ含まれています。オンにすると、GPS 位置が外部サーバーに送信されます。オフにすると、何も起こりません。

  • ボタンがオンになっていて、アプリ (アクティビティ) が閉じられている場合、ボタンが再びオフになるまで、位置情報は送信されます。

どうすればこれを達成できますか? 多くのスレッドやチュートリアル、および dev.google.com を読みましたが、問題の最適な解決策を見つけることができませんでした。

私の現在のアプローチ:

MainActivity.java

public void onClick(View v) {
   if (onOffButton.isChecked()) {
      Intent startIntent = new Intent(this, LocationService.class);
      startService(startIntent);
   } else {
      stopService(new Intent(this, LocationService.class));
   }
}

LocationService.java

public class LocationService extends Service implements LocationListener {

        final public static String START_ACTION = "START_LOCATION";
        final public static int NOTE_ID = 1;

        private int updateRate;

        private LocationManager locationManager;
        private NotificationManager notifyManager;

        @Override
        public IBinder onBind(Intent arg0) {
                return null;
        }

        @Override
        public void onStart(Intent intent, int startId) {
                super.onStart(intent, startId);

                // show popup message
                Toast.makeText(this, getText(R.string.start_message), Toast.LENGTH_SHORT).show();

                // display icon in status bar

                requestLocationUpdates();
        }

        private void requestLocationUpdates() {
                if(locationManager != null)
                        locationManager.removeUpdates(this);

                // get location service
                Criteria crit = new Criteria();
                crit.setPowerRequirement(Criteria.ACCURACY_FINE);
                String bestProvider = getLocationManager().getBestProvider(crit, true);
                getLocationManager().requestLocationUpdates(bestProvider, updateRate * 1000,
                                0 /* minDist */, this);

                LocationService.running = true;
        }

        @Override
        public void onDestroy() {
                super.onDestroy();
                getLocationManager().removeUpdates(this);
                notifyManager.cancel(NOTE_ID);
                Toast.makeText(this, getText(R.string.stop_message), Toast.LENGTH_SHORT).show();
                LocationService.running = false;
        }

        @Override
        public void onLocationChanged(Location location) {
                //Send Location to Server
        }

        @Override
        public void onProviderDisabled(String provider) {
                // TODO stop service, notify user
        }

        @Override
        public void onProviderEnabled(String provider) {
                requestLocationUpdates();
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
                // TODO notify user
        }

        private LocationManager getLocationManager() {
                if (this.locationManager == null)
                        this.locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
                return this.locationManager;
        }
}

インターネットで見つけた非常に古い gps トラッカーからこれを取得しました (onStart() は非推奨であり、onCommandStart() に置き換える必要があることを知っています)。一般的なアプローチが適切かどうかを知りたいだけです。

よろしく。

4

1 に答える 1

0

アプローチは良さそうです。コールバック メソッドを実装して、現在地を報告するだけです。

于 2013-03-21T07:09:44.097 に答える