2011-12-29 11 views
6

私がしようとしているのは、c2dmメッセージを受信したときに、「x」時間の位置を尋ねるサービスを開始し、その位置をサーバーに渡すことです。 c2dmメッセージはサービスを正しく開始し、GPSの位置はオンになりますが、更新されることはありません。スレッド内に指定した時間(現時点では12秒間)だけ存在し、何もしません。私はアプリ内で(サービスではなく)まったく同じコードを使用していて、完全に動作します。私は間違って何をしていますか?サービスとしてのLocationManagerの起動Android

これは、c2dmメッセージを受信するとサービスを開始します。

context.startService(new Intent(context, ServicePingLocation.class)); 

これはサービス自体のコードです。これまで呼び出されたものはすべて "onCreate"と "onStart"です。

public class ServicePingLocation extends Service implements LocationListener { 

private final String DEBUG_TAG = "[GPS Ping]"; 
private boolean xmlSuccessful = false; 
private boolean locationTimeExpired = false; 

private LocationManager lm; 
private double latitude; 
private double longitude; 
private double accuracy; 

@Override 
public void onLocationChanged(Location location) { 
    Log.d(DEBUG_TAG, "onLocationChanged"); 

    latitude = location.getLatitude(); 
    longitude = location.getLongitude(); 

    accuracy = location.getAccuracy(); 
} 

@Override 
public void onProviderDisabled(String provider) { 
    Log.d(DEBUG_TAG, "onProviderDisabled"); 
    Toast.makeText(
      getApplicationContext(), 
      "Attempted to ping your location, and GPS was disabled.", 
      Toast.LENGTH_LONG).show(); 
} 

@Override 
public void onProviderEnabled(String provider) { 
    Log.d(DEBUG_TAG, "onProviderEnabled"); 
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 10f, this); 
} 

@Override 
public void onStatusChanged(String provider, int status, Bundle extras) { 
    Log.d(DEBUG_TAG, "onStatusChanged"); 

} 

@Override 
public void onCreate() { 
    Log.d(DEBUG_TAG, "onCreate"); 
} 

@Override 
public void onDestroy() { 
    Log.d(DEBUG_TAG, "onDestroy"); 
} 

@Override 
public IBinder onBind(Intent intent) { 
    Log.d(DEBUG_TAG, "onBind"); 

    return null; 
} 

@Override 
public void onStart(Intent intent, int startid) { 
    Log.d(DEBUG_TAG, "onStart"); 

    lm = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); 

    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 10f, this); 
    lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000, 
      300f, this); 

    Log.d(DEBUG_TAG, lm.toString()); 

    new SubmitLocationTask(ServicePingLocation.this).execute(); 
} 

private void locationTimer() { 

    new Handler().postDelayed(new Runnable() { 
     // @Override 
     @Override 
     public void run() { 
      locationTimeExpired = true; 
     } 
    }, 12000); 
} 

private class SubmitLocationTask extends AsyncTask<String, Void, Boolean> { 

    /** application context. */ 
    private Context context; 

    private Service service; 

    public SubmitLocationTask(Service service) { 
     this.service = service; 
     context = service; 
    } 

    @Override 
    protected void onPreExecute() { 
     locationTimer(); // Start 12 second timer 
    } 

    @Override 
    protected void onPostExecute(final Boolean success) { 

     if (success && xmlSuccessful) { 
      lm.removeUpdates(ServicePingLocation.this); 
      onDestroy(); 
     } else { 
      if (!GlobalsUtil.DEBUG_ERROR_MSG.equals("")) 
       Toast.makeText(getBaseContext(), 
         GlobalsUtil.DEBUG_ERROR_MSG, Toast.LENGTH_SHORT) 
         .show(); 
      GlobalsUtil.DEBUG_ERROR_MSG = ""; 
     } 
    } 

    @Override 
    protected Boolean doInBackground(final String... args) { 
     try { 

      DateFormat df = null; 
      df = new SimpleDateFormat("M/d/yy h:mm a"); 
      Date todaysDate = new Date();// get current date time with 
              // Date() 
      String currentDateTime = df.format(todaysDate); 

      while ((accuracy > 100f || accuracy == 0.0) 
        && !locationTimeExpired) { 
       // We just want it to sit here and wait. 
      } 

      return xmlSuccessful = SendToServerUtil.submitGPSPing(
        0, longitude, 
        latitude, accuracy, currentDateTime); 
     } catch (Exception e) { 

      return false; 
     } 
    } 
} 

}

[編集] は私が持っていた問題を修正しました。コードは実際に動作していました。私はネットワークプロバイダを追加し、サービスを停止するonDestroy()メソッドを調整し、GPS信号を取得するために使用された時間を調整しました。

がアドバイスをありがとう、CommonsWare

+1

すべての状況で十分な長さでない場合があります。このようなシナリオ用に設計された私の['LocationPoller'](https://github.com/commonsguy/cwac-locpoll)を見てみるとよいでしょう。 – CommonsWare

+0

こんにちはRyan、私は実際に似たようなことに取り組んでいます。私はコードを動作させることができません。私はあなたのコードでテストしており、コンパイルしません。変数 "xmlSuccessful"とコード "SendToServerUtil"、 "GlobalsUtil"とは何ですか? –

+0

xmlSuccessfulは、サーバーに位置を送信した後にREST応答を処理するために使用したブール値です。 SendToServerUtilは、自分が所有していたユーティリティファイルです。これには、すべてのサーバー通信呼び出し(「SendLocation」など)が含まれています。 GlobalsUtilは、私がグローバル変数をすべて格納している一般的なユーティリティクラスです。その最後のものはおそらく良い習慣ではありませんが、私の最初の本当のアプリの1つでした。 どちらの方法でも、それらの参照をすべて削除することができます。問題はありません。 – RyanInBinary

答えて

0

は私が持っていた問題を修正しました。コードは実際に動作していました。私はネットワークプロバイダを追加し、サービスを停止するonDestroy()メソッドを調整し、GPS信号を取得するために使用された時間を調整しました。

アドバイスありがとうございましたCommonsWare

関連する問題