getLastKnownLocationはnullを返します


83

これについていくつか質問を読みましたが、必要な答えが見つかりませんでした。

つまり、マップを設定していて、現在のgpsの場所を取得したい場合です。変数がNULLでないことを確認しましたが、結果は次のとおりです。

getLastKnownLocation(provider, false);

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

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


getLastLocationの新しいAPIと古いAPIを混合していますこのstackoverflow.com/a/48033659/4997704に
Binesh Kumar 2017

この回答は読む価値があります:stackoverflow.com/a/38794291/5319831
MohdNaved19年

回答:


194

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

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;
}

1
私はずっとそれを正していたことがわかりました、私はこれに対する解決策を見つけたというエラーに気づきました。GPS用のGoogle位置を許可するように電話を設定していませんでした。だから、ええ。とにかくありがとう=)
Aleksander Fimreite 2013

1
優れた実装、非常に柔軟。ありがとう!
AlexVPerl 2015

2
チャームのように機能します。ありがとう!
erol yeniaras 2015

1
電話での位置情報を有効にします。
TharakaNirmana 2016

16
質問はgetLastKnownLocation returns null...このコードは何も変更しません...すべてのプロバイダーに対してmLocationManager.getLastKnownLocation (nullを返す可能性があるため) それでもnullを返します...答えは...申し訳ありませんがこれを回避することはできません...本当に必要な場合場所はgetLastKnownLocationを使用しません
Selvin

32

すべきでないときに、新しいロケーション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();
                }
            });
}

4
新しいAPIがあることを指摘していただきありがとうございます。これは受け入れられた答えでなければなりません。
バイオレットキリン

どうもありがとうございましたこのAPIははるかに高速ですありがとうございます私はそれが存在することを知りませんでした
Tabish 2018

1
ここでも場所はnullを返します。理由は何ですか?
JollyRoger 2018年

1
場所の許可を確認する
Binesh Kumar 2018

同意しました...これは受け入れられた答えであるはずです。ありがとうございました。
ニコラサルバロ

6

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


了解しました。キャッシュを構築する必要がありますか?これが原因でアプリがクラッシュした場合、どうすればよいですか?
Aleksander Fimreite 2013

1
ロケーションリスナーのonLocationChangedメソッドを使用する必要があります。有効な修正を取得するには時間がかかります(数分)
Sagar Maiyad 2013

わかりました、ありがとう。ログがポップするのが見えるまで
いじり

3
何も保存されていなくても、一緒に移動する必要がありますか?
Aleksander Fimreite 2013

1

このコードを追加します

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

関数の

locationManagerObject.requestLocationUpdates(LocationManager.GPS_PROVIDER, MINIMUM_TIME_BETWEEN_UPDATES, MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, new LocationListener()) だけでなく、機能: locationManagerObject.getLastKnownLocation(LocationManager.GPS_PROVIDER)


1

これを試してみてくださいそれは私にとってうまくいきます:-

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を使用すると、より高速な結果が得られます。


0

Xamarin.Androidでこの問題が発生しました。

Location location = locationManager.GetLastKnownLocation(provider);null値を返していました。コードを確認したところ、ACCESS_COARSE_LOCATIONの許可をリクエストしたばかりであることがわかりました。ACCESS_FINE_LOCATIONのアクセス許可をリクエストするコードを追加しましたが、nullが返されませんでした。これが私のコードです:

void AskPermissions()
{
    if (CheckSelfPermission(Manifest.Permission.AccessCoarseLocation) != (int)Permission.Granted ||
            CheckSelfPermission(Manifest.Permission.AccessFineLocation) != (int)Permission.Granted)
        RequestPermissions(new string[] { Manifest.Permission.AccessCoarseLocation, Manifest.Permission.AccessFineLocation }, 0);
    else
        GetLocation();
}

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
    if (CheckSelfPermission(Manifest.Permission.AccessCoarseLocation) == (int)Permission.Granted &&
            CheckSelfPermission(Manifest.Permission.AccessFineLocation) == (int)Permission.Granted)
        GetLocation();
    else
        Log.Info(tag, "Permission not Granted: Please enter desired Location manually.");
}

void GetLocation()
{
    locationManager = (LocationManager)GetSystemService(LocationService);
    provider = locationManager.GetBestProvider(new Criteria(), false);
    Location location = locationManager.GetLastKnownLocation(provider);
    if (location != null)
        Log.Info(tag, "Location Lat: " + location.Latitude + " Lon: " + location.Longitude);
    else
        Log.Info(tag, "Location is null");
}

Xamarin.Android(C#)から来た人がいる場合は、それが便利です。JavaやAndroidのメーカーのためのコードは次のように構文を変更し、いくつかのマイナーな類似しwithsだろうGetLastKnownLocation()だろうgetLastKnownLocation()C#でメソッド名は大文字の文字で始まる一方で、Javaのメソッド名は小文字で始まりとして。


0

私は場所を更新するためにこのソリューションが好きでした:

場所を更新する

履歴書で、条件を追加します。

Location myLocation = getLastKnownLocation();
if (myLocation == null) {
      locationManager.requestLocationUpdates(
      LocationManager.PASSIVE_PROVIDER,
      MIN_TIME_BW_UPDATES,
      MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
      Log.d("GPS", "GPS Enabled");
 }

基本的なことかもしれませんが、GPSがオンになっていることを確認してください。


-4

urラインをに置き換えます

Location location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.