2

更新:この質問 ( 1および2 ) で説明されているように、このエラーが発生していますが、この回答によると、これは内部ログにすぎず、機能に影響を与えるべきではありません

V/GoogleSignatureVerifier: com.google.android.gms 署名が無効です

元の質問:

アプリが強制終了された場合でも機能する必要がある、ユーザーの場所に関連するさまざまな機能を実装する必要があります。それを達成するために、私はサービスを使用しています。ユーザーを追跡しようとすると問題が発生します。場所の更新をリクエストする際に問題があるようです。

私のサービスの最も関連性の高い部分は次のとおりです。

免責事項: コードは読みやすいように簡略化されています。サービス バインディングに関連するすべてのメソッドは、問題の一部ではないため、いくつかのコールバックと共に削除されました。

public class LocationService extends RoboService implements LocationListener {

    private static final String TAG = "LocationService";
    private static final long UPDATE_INTERVAL_IN_MILLISECONDS = TimeUnit.SECONDS.toMillis(5);
    private static final long FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS = TimeUnit.SECONDS.toMillis(1);
    private GoogleApiClient mGoogleApiClient;
    private LocationRequest mLocationRequest;

    @Override
    public void onCreate() {
        super.onCreate();

        if (mGoogleApiClient == null) {
            mGoogleApiClient = new GoogleApiClient.Builder(this)
                    .addApi(LocationServices.API)
                    .build();

            mGoogleApiClient.connect();
        }

        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
        mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_REDELIVER_INTENT;
    }

    public Location getCurrentLocation() {
        ConnectionResult connectionResult = mGoogleApiClient.blockingConnect();
        if (connectionResult.isSuccess()) {
            return LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
        }
        return null;
    }

    public void startLocationUpdates() {
        ConnectionResult connectionResult = mGoogleApiClient.blockingConnect();
        if (connectionResult.isSuccess()) {
            Log.d(TAG, "startLocationUpdates: Posting request");
            LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
            Log.d(TAG, "startLocationUpdates: Request posted");
        }
    }

    @Override
    public void onLocationChanged(Location newLocation) {
        System.out.println("LocationService.onLocationChanged");
    }
}

アーキテクチャの制約で接続コールバックが使えないので使っmGoogleApiClient.blockingConnect()ていますが、現在地を取得しようとしても問題ありません。

私が呼び出すとstartLocationUpdates()、場所の更新を要求すると実行が失われたように見え、呼び出されるLog.d(TAG, "startLocationUpdates: Request posted")こともありませんonLocationChanged(Location newLocation)

ログキャットは次のとおりです。

05-23 11:42:47.509 13547-13547/com.example.location D/MapPresenterImpl: onRouteAdded: Starting route tracking
05-23 11:42:47.512 13547-13950/com.example.location D/LocationService: startLocationUpdates: Posting request
05-23 11:43:28.115 13547-13557/com.example.location W/art: Suspending all threads took: 7.530ms

私のコードは基本的にAndroid の例からコピーされています。サンプル ソース コードをダウンロードしたところ、正しく動作しました。私のコードと例の 2 つの唯一の違いは、サービス内にあることと を使用しているmGoogleApiClient.blockingConnect()ことですが、これがこのようにどのように影響するかはわかりません。

誰かがこの種の行動に直面したことがありますか? 私は本当に道に迷っており、助けていただければ幸いです。

回避策:

最後に、Callback アプローチの代わりに PendingIntent を使用してこの問題を解決しました。なぜこれが起こったのかを知りたいのですが、誰かがこの問題に直面していて、どうすればよいかわからない場合は、私の回避策を次に示します。

位置情報の更新を開始する方法:

public void startLocationTracking(long routeId) {
    ConnectionResult connectionResult = mGoogleApiClient.blockingConnect();
    if (connectionResult.isSuccess()) {
        Intent intent = new Intent(this, TrackingService.class);
        PendingIntent pi = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        LocationRequest request = new LocationRequest();
        request.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
        request.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
        request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

        LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, pi);
    }
}

追跡サービス:

public class TrackingService extends IntentService {

    public TrackingService() {
        super("TrackingService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        if (LocationResult.hasResult(intent)) {
            LocationResult locationResult = LocationResult.extractResult(intent);
            Location location = locationResult.getLastLocation();
            // Do whatever you need with the location
        }
    }
}

この方法を使用すると、別の奇妙な問題に直面しました。PendingIntent の構築に使用される Intent にエクストラを配置すると、TrackingService が呼び出されたときに、Intent エクストラには場所がなく、Intent の作成時に追加されたものだけが存在します。これに対する私の回避策は、SharedPreferences を使用して必要な ID を渡すことでしたが、このパッチにはあまり納得できません。この問題については、この質問で説明しています。

4

0 に答える 0