私がしようとしているのは、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
すべての状況で十分な長さでない場合があります。このようなシナリオ用に設計された私の['LocationPoller'](https://github.com/commonsguy/cwac-locpoll)を見てみるとよいでしょう。 – CommonsWare
こんにちはRyan、私は実際に似たようなことに取り組んでいます。私はコードを動作させることができません。私はあなたのコードでテストしており、コンパイルしません。変数 "xmlSuccessful"とコード "SendToServerUtil"、 "GlobalsUtil"とは何ですか? –
xmlSuccessfulは、サーバーに位置を送信した後にREST応答を処理するために使用したブール値です。 SendToServerUtilは、自分が所有していたユーティリティファイルです。これには、すべてのサーバー通信呼び出し(「SendLocation」など)が含まれています。 GlobalsUtilは、私がグローバル変数をすべて格納している一般的なユーティリティクラスです。その最後のものはおそらく良い習慣ではありませんが、私の最初の本当のアプリの1つでした。 どちらの方法でも、それらの参照をすべて削除することができます。問題はありません。 – RyanInBinary