web-dev-qa-db-ja.com

getLastKnownLocationはnullを返します

これに関するいくつかの質問を読みましたが、必要な答えを見つけることができませんでした。

そのため、マップをセットアップし、現在のGPS位置を取得したい場合があります。変数がNULLではないことを確認しましたが、まだ次の結果が得られています。

getLastKnownLocation(provider, false);

しかし、私にヌルを与えますので、これは私が助けを必要とする場所です。 COARSE + FINEロケーションの許可を追加しました。しかし、電話料金の予測できないデータフロー費用についてはあまり満足していないため、通常、電話ではあらゆる種類のネットワークデータが無効になっています。そのため、このテストではWiFiのみを有効にして接続しています。

これを可能にするために、さらに有効にする必要があるものはありますか? WiFiで十分だと思いますか?

68

このメソッドを使用して、最後の既知の場所を取得します。

LocationManager mLocationManager;
Location myLocation = getLastKnownLocation();

private Location getLastKnownLocation() {
    mLocationManager = (LocationManager)getApplicationContext().getSystemService(LOCATION_SERVICE);
    List<String> providers = mLocationManager.getProviders(true);
    Location bestLocation = null;
    for (String provider : providers) {
        Location l = mLocationManager.getLastKnownLocation(provider);
        if (l == null) {
            continue;
        }
        if (bestLocation == null || l.getAccuracy() < bestLocation.getAccuracy()) {
            // Found best last known location: %s", l);
            bestLocation = l;
        }
    }
    return bestLocation;
}
172
TharakaNirmana

新しい場所APIと古い場所APIを混在させるべきではありません。

最後の既知の場所を取得するには、電話するだけです

compile "com.google.Android.gms:play-services-location:11.0.1"
mLocationClient.getLastLocation();

位置情報サービスが接続された後。

新しいロケーションAPIの使用方法を読む

http://developer.Android.com/training/location/retrieve-current.html#GetLocation

 private void getLastLocationNewMethod(){
    FusedLocationProviderClient mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
    mFusedLocationClient.getLastLocation()
            .addOnSuccessListener(new OnSuccessListener<Location>() {
                @Override
                public void onSuccess(Location location) {
                    // GPS location can be null if GPS is switched off
                    if (location != null) {
                        getAddress(location);
                    }
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.d("MapDemoActivity", "Error trying to get last GPS location");
                    e.printStackTrace();
                }
            });
}
24
Binesh Kumar

ネットワークプロバイダーからキャッシュされた場所を取得しようとしています。有効な修正が得られるまで、数分待つ必要があります。ネットワークプロバイダーのキャッシュは空なので、明らかにそこにnullが表示されます。

5
Sagar Maiyad

これを試してみてください:-

LocationManager mLocationManager;
Location myLocation = getLastKnownLocation();

        private Location getLastKnownLocation() {
            Location oldLoc;
            while (true){
                oldLoc = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                if (oldLoc == null){
                    continue;
                }
                else {
                    break;
                }
            }
            return oldLoc;
        }

GPS_PROVIDERの代わりにNETWORK_PROVIDERを使用して、結果を高速化できます。

1
Sumit Sinha

このコードを追加

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
     return;
}

before関数:

locationManagerObject.requestLocationUpdates(LocationManager.GPS_PROVIDER, MINIMUM_TIME_BETWEEN_UPDATES, MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, new LocationListener())および関数:locationManagerObject.getLastKnownLocation(LocationManager.GPS_PROVIDER)

0
Krupa Kakkad