私のサービスでLocationUpdateを取得しようとすると、LocationListenerが起動しないようです。Androidサービスが位置情報の更新を受信しない
サービスがスレッドを開始し、Handler.postDelayed()でループします。私はもともとsleep(30000)を使用していましたが、これはlocationUpdatesを妨げている可能性があると考えました。すべてのサービスはこのスレッドを起動し、onStartCommandはSTICKYを返して実行し続けます。
public class TST extends Thread {
final int DefaultNetworkTick = 120000; // 2 minutes
final int DefaultLocationTick = 20000; //600000;
boolean CustomLocationUpdateTick = false; // If the network requests faster updates
int CustomLocationUpdateTickMs = 600000; // Default 10 minutes
public boolean kill = false;
public Context context;
Handler handler = new Handler();
Date nextNetworkReadTick;
@Override
public void run() {
Log.i("TST", "Start run() iteration");
// Set the ticks to the appropriate values
// Network gets read every 2 minutes
nextNetworkReadTick = new Date();
nextNetworkReadTick.setTime(nextNetworkReadTick.getTime() + DefaultNetworkTick);
Log.i("TST", "Set next Network tick to " + nextNetworkReadTick.toString());
Looper.prepare();
Log.i("TST", "Performing location update setup...");
SetupLocationListenerDefault();
handler.postDelayed(runFunc, 2000);
Looper.loop();
}
// We do our networking and stuff in here
public Runnable runFunc = new Runnable(){
public void run()
{
Log.i("TST", "run() iteration");
if(new Date().after(nextNetworkReadTick)) {
// Set next tick
nextNetworkReadTick = new Date();
nextNetworkReadTick.setTime(nextNetworkReadTick.getTime() + DefaultNetworkTick);
UpdateNetwork();
}
handler.postDelayed(runFunc, 1000);
}
};
private void UpdateNetwork() {
// TODO Auto-generated method stub
}
LocationManager locMgr;
PendingIntent locationUpdateIntentPending;
Intent locationUpdateIntent;
LocationListener locationListener = new LocationListener()
{
@Override
public void onLocationChanged(Location arg0) {
// TODO Auto-generated method stub
Log.i("TST", "OnLocationChanged: " + arg0.toString());
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
Log.i("TST", "OnProviderDisabled: " + provider);
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
Log.i("TST", "OnProviderEnabled: " + provider);
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
Log.i("TST", "OnStatusChanged");
}
};
private void SetupLocationListenerDefault() {
// Reset location manager
if(locMgr != null) {
locMgr.removeUpdates(locationListener);
locMgr = null;
}
locMgr = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
String provider = locMgr.getBestProvider(criteria, true);
locMgr.requestLocationUpdates(provider, DefaultLocationTick, 0, locationListener);
}
}
私はこれがはっきりと分かりますが、あなたは地元の仲間を得ることができますか?以前はgpsの代わりにネットワークを返す基準を使用していましたが、もしあなたが内部にいれば、実際に信号に依存していないかもしれません。このコードをサービスの外で試してみましたか?それが問題かどうかを確認してください。おそらく問題のあるサービスであるかどうかを確認するためにプログラムの簡単なスタブに入れてください。 – Idistic