11

デバイスの現在の場所を見つけるために使用されるアプリケーションを 1 つ開発しました。Fused Location API を使用して現在の位置を取得しました。

非常に奇妙な問題に直面しています。一部のデバイスでは、組み込みの Google マップを開くまで正確な現在位置を取得できません。Google マップを開いてアプリケーションに戻ると、その時点でアプリケーションが正確な位置を返します。

これが私の位置情報リクエストです。

mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(UPDATE_INTERVAL);
mLocationRequest.setFastestInterval(FATEST_INTERVAL);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setSmallestDisplacement(DISPLACEMENT); // 10 meters

誰が何が間違っているのか教えてもらえますか? あなたの助けは本当に感謝しています.

4

4 に答える 4

3

そのため、Waze と私たちは過去に FusedLocation を使用しましたが、多くの問題に直面しました。API が壊れています。適切に機能しないデバイスがいくつかあります。多くのリレーが機能していないことを融合したアクティビティ認識と、適切にスタッフを認識します。最後に、ロケーション マネージャー API に戻ります。

ここにスニペット:

ロケーション マネージャーを起動し、別のスレッドで更新の要求を開始します。プロバイダーごとに個別のリスナーを個人的に登録します

if (mLocationManager == null) {
        LOGGER.info("Location track,start called first time. Creating Location Manager");
        mLocationManager = (LocationManager) mContextWeakReference.get()
                .getSystemService(Context.LOCATION_SERVICE);

        mLocationHandlerThread
                = new HandlerThread("LocationThread", Thread.NORM_PRIORITY);
        mLocationHandlerThread.start();
        // Now get the Looper from the HandlerThread
        // NOTE: This call will block until the HandlerThread gets control and initializes its Looper
        Looper looper = mLocationHandlerThread.getLooper();
        Location networkLastKnownLocation = null;
        Location gpsLastKnownLocation = null;
        mGpsLocationListener = new GpsLocationListener();
        mNetworkLocationListener = new NetworkLocationListener();

        // Register the listener with the Location Manager to receive location updates
        if (mLocationManager.getAllProviders().contains(LocationManager.GPS_PROVIDER)) {
            mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                    LOCATION_REQUEST_INTERVAL_MILLIS, SMALLEST_DISPLACEMENT_METERS,
                    mGpsLocationListener,
                    looper);

            gpsLastKnownLocation = mLocationManager
                    .getLastKnownLocation(LocationManager.GPS_PROVIDER);
        } else {
            setGpsProviderAvailable(false);
        }
        if (mLocationManager.getAllProviders().contains(LocationManager.NETWORK_PROVIDER)) {
            networkLastKnownLocation = mLocationManager
                    .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
            mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
                    LOCATION_REQUEST_INTERVAL_MILLIS, SMALLEST_DISPLACEMENT_METERS,
                    mNetworkLocationListener,
                    looper);
        }

        setLastKnownLocationDifferentProviders(gpsLastKnownLocation,
                networkLastKnownLocation);

    }

リスナーは次のとおりです。

public class GpsLocationListener implements LocationListener {

    @Override
    public void onLocationChanged(Location location) {
        LOGGER.info("Location track ,onLocationChanged location={}", location);
        switch (location.getProvider()) {
            case LocationManager.GPS_PROVIDER:
                if (mLocationManager != null) {
                    mLocationManager.removeUpdates(mNetworkLocationListener);
                }
                break;
        }
        setLastKnownLocation(location);
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        LOGGER.info("onStatusChanged: {}, status: {}", provider, status);
    }

    @Override
    public void onProviderEnabled(String provider) {
        LOGGER.info("onProviderEnabled: " + provider);
        if (provider.equals(LocationManager.GPS_PROVIDER)) {
            setGpsProviderAvailable(true);
        }
    }

    @Override
    public void onProviderDisabled(String provider) {
        LOGGER.info("onProviderDisabled: " + provider);
        if (provider.equals(LocationManager.GPS_PROVIDER)) {
            setGpsProviderAvailable(false);
        }
    }
}

public class NetworkLocationListener implements LocationListener {

    @Override
    public void onLocationChanged(Location location) {
        LOGGER.info("Location track ,onLocationChanged location={}", location);
        switch (location.getProvider()) {
            case LocationManager.NETWORK_PROVIDER:
                setLastKnownLocation(location);
                break;
        }
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        LOGGER.info("onStatusChanged: {}, status: {}", provider, status);
    }

    @Override
    public void onProviderEnabled(String provider) {
        LOGGER.info("onProviderEnabled: " + provider);
        if (provider.equals(LocationManager.GPS_PROVIDER)) {
            setGpsProviderAvailable(true);
        }
    }

    @Override
    public void onProviderDisabled(String provider) {
        LOGGER.info("onProviderDisabled: " + provider);
        if (provider.equals(LocationManager.GPS_PROVIDER)) {
            setGpsProviderAvailable(false);
        }
    }
}

すべてのスレッドを登録解除して停止することを忘れないでください:)

于 2016-04-07T15:59:15.133 に答える
0

LocationRequest を作成するときは、setPriority() を PRIORITY_NO_POWER に設定する必要があります。

PRIORITY_NO_POWER は、電話の他のアプリが場所を要求して受信しない限り、アプリが場所を取得しないことを意味します。詳しくはLocationRequestをご覧ください。

于 2016-02-17T12:40:41.523 に答える
0

マシュマロ以上のバージョンのデバイスでテストしていますか?
Lollipop より上のデバイスでは、実行時に位置情報の許可を要求する必要があります。このリンクを参照してくださいhttp://developer.android.com/training/permissions/requesting.html
したがって、場所の許可がないため、正確な場所は返されませんが、既に Gps の許可を持っているマップ アプリを起動すると、は、Google Play サービスの現在地を更新します。場所は最終的に Google Play サービスから取得されるため、正しい場所も表示されます。

于 2016-04-06T17:27:17.507 に答える
0

これについてはよくわかりませんが、最後にこのようなものを見たことがあります。その電話には専用の GPS がありませんでした。GPSしかありませんでした。

長い間いじくり回した後、これが正確な位置を取得できない理由であることに気付きました。しかし、地図を開いた後、何らかの理由で位置が正確でした。電話に専用の GPS が搭載されていなくても、Google は地図上で正確な位置情報を取得するために、間違いなく他の多くのことを行っています。デバイスとそのハードウェア仕様を確認してください。

于 2016-02-17T12:36:45.433 に答える