0

最新の GPS 座標を取得し、PHP スクリプトを介してサーバーに投稿するバックグラウンド サービスを実行しようとしています。

これは、情報をサーバーに投稿するという意味で機能しており、バックグラウンドで(サービスとして)そうします。

以下のスニペットでは、常に false (location == null) です。

私は Java プログラミングが初めてで、これを正しく行っているとは思いません。GPS の更新があるたびに更新する変数を用意し、それをバックグラウンド サービスから読み取る必要がありますか?

GPS 機能をこの Service クラスとは別にして、データが必要なときに呼び出す必要がありますか? または、 AsyncTask を使用する必要がありますか?

質問が初心者で申し訳ありませんが、Java は PHP に比べてかなり複雑です。

ありがとうございました。

    Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

    String Long = null;
    String Lat = null;

    if (location != null) {
    Long =  String.format("%1$s",location.getLongitude());
    Lat = String.format("%1$s", location.getLatitude());
     } 
     else{
     Long = "error";
     Lat = "error";

     }

以下は完全なコードです。

    public class UpdaterService extends Service {
      private static final String TAG = UpdaterService.class.getSimpleName();
      private Updater updater;

      private static final long MINIMUM_DISTANCE_CHANGE_FOR_UPDATES = 1; // in Meters
      private static final long MINIMUM_TIME_BETWEEN_UPDATES = 1000; // in Milliseconds
      protected LocationManager locationManager;

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

      @Override
      public void onCreate() {
        super.onCreate();
        updater = new Updater();

        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        locationManager.requestLocationUpdates(
                LocationManager.GPS_PROVIDER, 
                MINIMUM_TIME_BETWEEN_UPDATES, 
                MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, 
                new MyLocationListener()
                );

        Log.d(TAG, "onCreate'd");

      }


        private class MyLocationListener implements LocationListener {

            public void onLocationChanged(Location location) {
            }

            public void onStatusChanged(String s, int i, Bundle b) {
            }

            public void onProviderDisabled(String s) {
            }

            public void onProviderEnabled(String s) {
            }

        }


    @Override
      public synchronized void onStart(Intent intent, int startId) {
          // Start the updater
        if (!updater.isRunning()) {
          updater.start();
        }

        Log.d(TAG, "onStart'd");
      }


      @Override
      public synchronized void onDestroy() {
        super.onDestroy();
        // Stop the updater
        if (updater.isRunning()) {
          updater.interrupt();
        }
        updater = null;
        Log.d(TAG, "onDestroy'd");
      }

      // ///// Updater Thread
      class Updater extends Thread {
        private static final long DELAY = 10000; // one minute
        private boolean isRunning = false;

        public Updater() {
          super("Updater");
        }

        @Override
        public void run() {
          isRunning = true;
          while (isRunning) {
            try {

              Log.d(TAG, "Updater run'ing");
              HttpClient httpclient = new DefaultHttpClient();
              HttpPost httppost = new HttpPost("http://www.mydomain.com/save.php");

              try {
                // Add your data
                  Log.d(TAG, "Working..");

                  Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

                 String Long = null;
                 String Lat = null;

                  if (location != null) {
                     Long =  String.format("%1$s",location.getLongitude());
                     Lat = String.format("%1$s", location.getLatitude());
                  } 
                  else{
                    Long = "error";
                    Lat = "error";

                  }


                 List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3);
                  nameValuePairs.add(new BasicNameValuePair("lid", "1"));
                  nameValuePairs.add(new BasicNameValuePair("lat",Lat));
                  nameValuePairs.add(new BasicNameValuePair("long", Long));
                  httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

                  // Execute HTTP Post Request
                  HttpResponse response = httpclient.execute(httppost);


              } catch (ClientProtocolException e) {
                  // TODO Auto-generated catch block
              } catch (IOException e) {
                  // TODO Auto-generated catch block
              }


              // Sleep
              Thread.sleep(DELAY);
            } catch (InterruptedException e) {
              // Interrupted
              isRunning = false;
            }
          } // while
        }

        public boolean isRunning() {
          return this.isRunning;
        }

      }

    }

以下は主なアクティビティです。

    public class Main extends Activity {
              /** Called when the activity is first created. */
          @Override
          public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
          }

          @Override
          protected void onStop() {
            super.onStop();

          }

          // /////// Menu Stuff

          @Override
          public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.activity_main, menu);
            return true;
          }

          @Override
          public boolean onOptionsItemSelected(MenuItem item) {

            switch (item.getItemId()) {
            case R.id.itemPrefs:
           //     startService(new Intent(this, UpdaterService.class));
             break;
            case R.id.itemServiceStart:
              startService(new Intent(this, UpdaterService.class));
              break;
            case R.id.itemServiceStop:
              stopService(new Intent(this, UpdaterService.class));
              break;
            }

            return true;
          }



        }
4

1 に答える 1

0

以下のスニペットでは、常に false(location == null)です。

エミュレーターでコードを実行している場合は、GPS データをエミュレーターに手動で供給する必要があります (Eclipse の DDMS の観点から)。

私は Java プログラミングが初めてで、これを正しく行っているとは思いません。GPS の更新があるたびに更新する変数を用意し、それをバックグラウンド サービスから読み取る必要がありますか?

はい、できます。私は以前に同様のことをしましたが、うまくいきます。

GPS 機能をこの Service クラスとは別にして、データが必要なときに呼び出す必要がありますか? または、AsyncTask を使用する必要がありますか?

いいえ!しかし、次のようなことをするといいでしょう:

public class UpdaterService extends Service implements LocationListener{
}

初心者っぽい部分については。愚かな質問はありません。私たちは皆、どちらかといえば初心者です。お役に立てれば。

于 2013-05-04T11:09:32.630 に答える