web-dev-qa-db-ja.com

Oreo(8.0.0+)(API 26+)で、アプリがバックグラウンドにあるときや強制終了したときに位置情報サービスを更新する方法

In Android O(8.0.0+)(API 26+)、アプリがバックグラウンドまたは強制終了のときに位置情報サービスの更新を取得する方法。In "Strava" Androidアプリ( Playストア で利用可能)、アプリがバックグラウンドまたはキルのときに位置情報サービスが適切に実行されます。アプリで同じ機能を構築する必要があります。

startService(new Intent(this, GpsServices.class));

次に、onDestroyメソッドは、アプリがアイドルモード(アプリがバックグラウンドまたは強制終了)である10秒後に呼び出されます。以下は私のコードです。

public class GpsServices extends Service implements LocationListener, Listener {

    @Override
    public void onCreate() {
        mLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        if (mLocationManager != null) {
            mLocationManager.addGpsStatusListener(this);
        }
        if (mLocationManager != null) {
            mLocationManager.requestLocationUpdates(
                LocationManager.GPS_PROVIDER,
                500,
                0,
                this);
        }    
    }

    public void onLocationChanged(Location location) {
        System.out.println("location = [" + location + "]");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // If we get killed, after returning from here, restart
        return START_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        // We don't provide binding, so return null
        return null;
    }

    /* Remove the locationlistener updates when Services is stopped */
    @Override
    public void onDestroy() {
        try {
            mLocationManager.removeUpdates(this);
            mLocationManager.removeGpsStatusListener(this);
            stopForeground(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

任意の助けをいただければ幸いです。

15

以下の2つのオプションのいずれか、または両方の組み合わせを試すことができます。これにより、直面したときに問題が解決しました。

オプション1

位置情報の更新をバックグラウンドで実行し続けるには、 LocationServices AP​​IFusedLocationProviderClient と一緒に使用する必要があります here =および here ドキュメント内または here CODEPATH内。

オプション2

Android Oreo 8.0ドキュメントを here のどこかに適切に読んだら、このソリューションにたどり着いたでしょう。

ステップ1:以下のコードに示されているように、必ずフォアグラウンドサービスとしてサービスを開始してください

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {

            mainActivity.startService(new Intent(getContext(), GpsServices.class));
            mainActivity.startService(new Intent(getContext(), BluetoothService.class));
            mainActivity.startService(new Intent(getContext(), BackgroundApiService.class));
        }
        else {
            mainActivity.startForegroundService(new Intent(getContext(), GpsServices.class));
            mainActivity.startForegroundService(new Intent(getContext(), BluetoothService.class));
            mainActivity.startForegroundService(new Intent(getContext(), BackgroundApiService.class));
        }

ステップ2:通知を使用して、サービスが実行されていることを示します。 onCreateサービスメソッドに以下のコード行を追加します。

@Override
public void onCreate() {
    ...
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        startForeground(NOTIFICATION_ID, notification);
    }
    ...
}

ステップ3:サービスが停止または破棄されたら、notificationを削除します。

@Override
public void onDestroy() {
    ...
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
          stopForeground(true); //true will remove notification
    }
    ...
}

オプション2の1つの問題は、実行中のすべてのデバイスでnotificationが実行されるまでGpsServiceを表示し続けることです。 onAndroid Oreo 8.0.

これらのオプションは両方とも、アプリがバックグラウンドまたはキル状態にある場合でも機能すると確信しています。

この解決策があなたの問題を解決することを願っています。

22
Amrut Bidri

この問題を解決する鍵は、通知ジェネレーターのようです。次のリンクは、私が要約できるよりも優れた実用的なソリューションを説明しています。

https://hackernoon.com/Android-location-tracking-with-a-service-80940218f561

1
Luke Dupin