更新:この質問 ( 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 を渡すことでしたが、このパッチにはあまり納得できません。この問題については、この質問で説明しています。