-2

バックグラウンドで実行され、緯度と経度が30〜45秒ごとに表示されるサービスを開始したいと思います。以下は私が使用している私のコードです:

public class LocalService extends Service implements LocationListener {
    private final static String TAG = "LocalService";
    LocationManager lm;


    public LocalService() {
    }

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

    @Override
    public void onCreate() {
        subscribeToLocationUpdates();
    }

    public void onLocationChanged(Location loc) {
        Log.d(TAG, loc.toString());
        Toast.makeText(getApplicationContext(), loc.getLatitude() + " - " + loc.getLongitude(), Toast.LENGTH_LONG).show();
        Log.i("Location", loc.getLatitude() + " - " + loc.getLongitude());
    }

    public void onProviderEnabled(String s) {
    }

    public void onProviderDisabled(String s) {
    }

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

    public void subscribeToLocationUpdates() {
        this.lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        this.lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 30, 0, this);
    }
}

私はこのように私のサービスを呼んでいます:

startService(new Intent(TimerServiceActivity.this,
         LocalService.class));

これは私のサービスのマニフェストコードです:

<service android:name="LocalService" >

このコードを実行しているときはいつでも、残念ながらTimerService停止したというエラーメッセージが表示されます。

4

2 に答える 2

1

マニフェストに権限が追加されていますか?

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

代わりに、バッテリーの使用に最適化されたこのライブラリを使用することを強くお勧めします。使用はかなり簡単です。

http://code.google.com/p/little-fluffy-location-library/

Reto Meierによるandroid-protips-locationの概念と、彼のブログ投稿A Deep DiveIntoLocationからのいくつかのコードに基づいています。

于 2012-12-26T17:21:42.573 に答える
1

最初にプロバイダーにサブスクライブする必要があります。これを行うには、onCreate()メソッドの先頭にこれを追加します。

            locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    // Define the criteria how to select the locatioin provider -> use
    // default
    Criteria criteria = new Criteria();
    criteria.setAccuracy(Criteria.ACCURACY_FINE);
    provider = locationManager.getBestProvider(criteria, false);

    Location location = locationManager.getLastKnownLocation(provider);
    Log.v(TAG, "Init");
    // Initialize the location fields
    if (location != null) {
        System.out.println("Provider " + provider + " has been selected.");
        onLocationChanged(location);
    }
于 2012-12-26T17:41:56.227 に答える