web-dev-qa-db-ja.com

Android用GooglePlay開発者サービス。 Wi-Fiが無効になっている場合、ロケーションクライアントはロケーションを更新しません

私たちのアプリは、LocationClientとIntentServiceを使用して場所を更新するようリクエストします。ユーザーが電話の設定でwifiを無効にすると、場所はまったく更新されません。

Wi-Fiが無効になっているときに、PRIORITY_HIGH_ACCURACYと位置情報の更新を使用してアプリをテストしようとしました。

ユーザーがwifiネットワークが利用できない場所に移動した場合も同じ問題が発生します。

電話がwifiで位置を更新できない場合、正しい動作は位置の更新に他の電話センサー(GPSなど)を使用することだと思います。

再現する手順:

  1. 保留中のインテントで場所の更新を開始します。パラメータ付き

    LocationRequest request = LocationRequest.create()
            .setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY)
            .setInterval(5 * 60 * 1000)
            .setFastestInterval(60*1000)
            .setSmallestDisplacement(70);
    
  2. 電話の設定でwifiを無効にするか、wifiネットワークが利用できない国の電話を使用してください。

Android 4.4、4.3、4.1、4.0、2.3.3。(Nexus7、Nexus4、Samsung GS2、HTC Wildfireなど)でテスト済み

public class TrackerService extends IntentService {
    private void startUpdateLocation() {
        PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(),
            0, new Intent(ACTION_LOCATION_UPDATED), 0);
        LocationRequest request = LocationRequest.create()
            .setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY)
            .setInterval(5 * 60 * 1000)
            .setFastestInterval(60*1000)
            .setSmallestDisplacement(70);

        getLocationClient().requestLocationUpdates(request, pendingIntent);
        Log.d(Utils.getMethodName(), "Location update started");
    }

    private LocationClient getLocationClient() {
        if (mLocationClient != null && mLocationClient.isConnected()) return mLocationClient;
        mLocationClient = new LocationClient(this,
            new GooglePlayServicesClient.ConnectionCallbacks() {
                @Override
                public void onConnected(Bundle bundle) {
                    Log.d(Utils.getMethodName(), "Location client. Connected");
                }

                @Override
                public void onDisconnected() {
                    Log.d(Utils.getMethodName(), "Location client. Disconnected");
                }
            },
            new GooglePlayServicesClient.OnConnectionFailedListener() {
                @Override
                public void onConnectionFailed(ConnectionResult connectionResult) {
                    throw new IllegalStateException("Failed connection to location manager " + connectionResult.toString());
                }
            }
        );
        mLocationClient.connect();
        try {
            while (mLocationClient.isConnecting()) {
                Thread.sleep(200);
            }
        } catch (InterruptedException e) {
            throw new IllegalStateException("Thread interrupted", e);
        }
        return mLocationClient;
    }
}

バグレポートを送信しようとしました https://code.google.com/p/Android/issues/detail?id=6311

Androidの開発者は助けることができません。

Google Play開発者サービスのバグについてどこに報告できますか?

Google Play開発者サービスのバグですか?

どのような回避策を提供できますか?

PRIORITY_HIGH_ACCURACYは電話のバッテリーを消耗するため、使用したくありません。私たちのアプリケーションは電話の場所を追跡しており、wifiの設定やwifiネットワークの可用性に依存するべきではありません。

19
asivura

私は解決策を見つけました。

GoogleはLocationClientのドキュメントを変更しました。今それは言う:

public static final int PRIORITY_BALANCED_POWER_ACCURACY

SetPriority(int)とともに使用して、「ブロック」レベルの精度を要求します。

ブロックレベルの精度は約100メートルの精度と見なされます。このような粗い精度を使用すると、多くの場合、消費電力が少なくなります。

粗い精度を使用-優先度がPRIORITY_BALANCED_POWER_ACCURACYの場合、ロケーションクライアントは位置の更新にGPSを使用しないことを意味すると思います。

したがって、GPSを使用するには、PRIORITY_HIGH_ACCURACYを使用する必要があります。

10
asivura

これに対する1つの答えをあげようと思います。数分前まで私は同じ問題を抱えていて、ここに答えがあることを望んでいました。

私の問題と解決策を説明します:

問題:Google Play開発者サービスのLocationClientを使用しているときに、インターネットに接続せずに位置情報の更新を取得できませんでした。 GPSが有効になっています。

私のコードは安定していて、インターネットで利用できましたが、フィールドテストは失敗しました。

考えられる根本原因:1)LocationClientが吸い込まれた2)LocationClientがgpsの更新を取得しなかった

解決策:これをテストするために、Googleマップアプリを使用してみました。インターネットに接続できないと文句を言ったので、あげました。次に、自分の場所を特定しようとしましたが、「Googleアプリ」に自分の場所へのアクセスを許可する必要があるという新しい画面が表示されました。これはグーグル以外のサードパーティのアプリには影響しないと言われており、完全にでたらめであることが判明しました。 「Googleアプリのみ」を有効にして自分の場所にアクセスすると、自分のアプリが数秒以内に突然動作を開始しました。 Androidの開発は、これらの「Googleの瞬間」でいっぱいです。

6
Andreas

誰かがまだ疑問に思っているなら、

Googleのドキュメントによると:

NETWORK_PROVIDERとGPS_PROVIDERの両方を使用している場合は、両方のプロバイダーのアクセス許可が含まれているため、ACCESS_FINE_LOCATIONアクセス許可のみを要求する必要があります。 ACCESS_COARSE_LOCATIONのアクセス許可は、NETWORK_PROVIDERへのアクセスのみを許可します。

1
ShahrozKhan91