LocationClient getLastLocation () вяртае нуль

Як пытанні, хто-то сустракаліся раней Я праверыў адзін Нексус s (4.0.4 з Google Play паслугі даступная) і AVD (4.2.2 з Google API), у абедзвюх выпадках locationclient ў getLastLocation() заўсёды вяртае нулявога </код >.

public class MainActivity extends Activity implements LocationListener,
        GooglePlayServicesClient.ConnectionCallbacks,
        GooglePlayServicesClient.OnConnectionFailedListener {

    private LocationClient mLocationClient;
    private LocationRequest mLocationRequest;
    boolean mUpdatesRequested = false;
    boolean mConnected = false;
    SharedPreferences mPrefs;
    SharedPreferences.Editor mEditor;
    private TextView mText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mText = (TextView) findViewById(R.id.text);
        mLocationRequest = LocationRequest.create();
        mLocationRequest
                .setInterval(LocationUtils.UPDATE_INTERVAL_IN_MILLISECONDS);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        mLocationRequest
.setFastestInterval(LocationUtils.FAST_INTERVAL_CEILING_IN_MILLISECONDS);
        mUpdatesRequested = false;
        mPrefs = getSharedPreferences(LocationUtils.SHARED_PREFERENCES,
                Context.MODE_PRIVATE);
        mEditor = mPrefs.edit();
        mLocationClient = new LocationClient(this, this, this);
    }
    @Override
    public void onStart() {
        super.onStart();
        /*
         * Connect the client. Don't re-start any requests here; instead, wait
         * for onResume()
         */
        mLocationClient.connect();
    }

    @Override
    protected void onResume() {
        super.onResume();
       //If the app already has a setting for getting location updates, get it
        if (mPrefs.contains(LocationUtils.KEY_UPDATES_REQUESTED)) {
            mUpdatesRequested = mPrefs.getBoolean(
                    LocationUtils.KEY_UPDATES_REQUESTED, false);
           //Otherwise, turn off location updates until requested
        } else {
            mEditor.putBoolean(LocationUtils.KEY_UPDATES_REQUESTED, false);
            mEditor.commit();
        }
    }
    @Override
    public void onStop() {
       //If the client is connected
        if (mLocationClient.isConnected()) {
            stopPeriodicUpdates();
        }
       //After disconnect() is called, the client is considered "dead".
        mLocationClient.disconnect();
        super.onStop();
    }

    @Override
    public void onPause() {
       //Save the current setting for updates
        mEditor.putBoolean(LocationUtils.KEY_UPDATES_REQUESTED,
                mUpdatesRequested);
        mEditor.commit();
        super.onPause();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
       //Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    public void getLocation(View v) {
       //If Google Play Services is available
        if (isGooglePlayServicesAvailable()) {
            if (!mConnected)
                mText.setText("location client is not connected to service yet");
            else {
               //Get the current location
                Location currentLocation = mLocationClient.getLastLocation();
               //Display the current location in the UI
                mText.setText(LocationUtils.getLocationString(currentLocation));
            }
        }
    }

    private boolean isGooglePlayServicesAvailable() {

       //Check that Google Play services is available
        int resultCode = GooglePlayServicesUtil
                .isGooglePlayServicesAvailable(this);

       //If Google Play services is available
        if (ConnectionResult.SUCCESS == resultCode) {
           //In debug mode, log the status
            Log.d(LocationUtils.APPTAG, "google play service is available");

           //Continue
            return true;
           //Google Play services was not available for some reason
        } else {
           //Display an error dialog
            Dialog dialog = GooglePlayServicesUtil.getErrorDialog(resultCode,
                    this, 0);
            if (dialog != null) {
                Log.e(LocationUtils.APPTAG,
                        "google play service is unavailable");
            }
            return false;
        }
    }

    private void stopPeriodicUpdates() {
        mLocationClient.removeLocationUpdates(this);
       //mConnectionState.setText(R.string.location_updates_stopped);
    }

    @Override
    public void onConnectionFailed(ConnectionResult arg0) {
        mConnected = false;
        Log.d(LocationUtils.APPTAG, "connection failed");
    }

    @Override
    public void onConnected(Bundle arg0) {
        mConnected = true;
        Log.d(LocationUtils.APPTAG,
                "location client connected to the location server");
        LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        lm.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 0, 0,
                new android.location.LocationListener() {
                    @Override
                    public void onStatusChanged(String provider, int status,
                            Bundle extras) {}

                    @Override
                    public void onProviderEnabled(String provider) {}

                    @Override
                    public void onProviderDisabled(String provider) {}

                    @Override
                    public void onLocationChanged(final Location location) {
                    }
                });
        Log.d(LocationUtils.APPTAG, "done trying to get location");
    }

    @Override
    public void onDisconnected() {
       //TODO Auto-generated method stub
        mConnected = false;
        Log.d(LocationUtils.APPTAG,
                "location client disconnected from the location server");
    }

    @Override
    public void onLocationChanged(Location arg0) {}

}

большасць з іх прыйшлі з прыкладаў, прыведзеных у Google. У прыведзеным вышэй кодзе хава паспрабаваў метад накшталт:

LocationRequest request = LocationRequest.create();
request.setNumUpdates(1);
mLocationClient.requestLocationUpdates(request, this);

і

LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        lm.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 0, 0,
                new android.location.LocationListener() {
                    @Override
                    public void onStatusChanged(String provider, int status,Bundle extras) {}

                    @Override
                    public void onProviderEnabled(String provider) {}

                    @Override
                    public void onProviderDisabled(String provider) {}

                    @Override
                    public void onLocationChanged(final Location location) {}
                });

У onConnected() перад выклікам getLastLocation() , але да гэтага часу не атрымліваюць ніякай ўдачы. Дзе памылка, загадзя дзякуй.

55
БРТ ... яна падахвочвае людзей адказаць больш, а таксама дапамагае будучым наведвальнікам :)
дададзена аўтар Rachit Mishra, крыніца
Вы павінны прыняць адказ або прапанаваць, як вы вырашалі праблему.
дададзена аўтар Rachit Mishra, крыніца
У мяне быў той жа выпадак, толькі перазагрузка тэлефона выправіў паводзіны. Я атрымаў пастаянны аб'ект NULL і размяшчэнне ў сеткі не атрымалася ў цэлым. Пасля халоднага скіду зноў працавала як трэба і getLastLocation() вяртаецца аб'ект.
дададзена аўтар John, крыніца
@twntee ў цяперашні час я толькі з дапамогай <�ЛАК, дзе Ci> для размяшчэння асобніка, але для адказу я выбраў першы ~
дададзена аўтар oscarthecat, крыніца

13 адказы

У цяперашні час Плаўлены Размяшчэнне Provider будзе падтрымліваць толькі фонавае месца, калі па меншай меры адзін кліент падлучаны да яго. Пасля таго, як першы кліент падключаецца, ён адразу ж паспрабуе атрымаць месца. Калі ваша дзейнасць з'яўляецца першым кліентам для падлучэння і вы выклікаеце getLastLocation() адразу ў onConnected() , які можа не быць дастаткова часу для першага месца, каб прыйсці.

48
дададзена
Эй Дэвід, можа я спытаць, як вы ведаеце, што пра «па меншай меры адзін кліент"? ... было б межжала чытаць.
дададзена аўтар Mathias, крыніца
ok..i agree..but я павінен бесперапынна называць getLastLocation() ў патоку, пакуль яна не вяртае не нулявы значэнне ..
дададзена аўтар Anirudha, крыніца
getLastLocation добры для выпадкаў «негарантаванай», дзе месца неабходна адразу ці наогул не можа быць выкарыстаны. Калі вы сапраўды хочаце чакаць месца, лепш выкарыстоўваць requestLocationUpdates і чакаць зваротнага выкліку, а не busywaiting ў патоку. Калі вы проста хочаце, у адным месцы, вы можаце паказаць, што ў LocationRequest, і запыт будзе аўтаматычна выдалены, як толькі ваша абнаўленне прыходзіць.
дададзена аўтар David, крыніца
Калі месца недаступна, што павінна адбыцца вельмі рэдка, нуль будзе вернуты. Праверце дакументацыю, developer.android.com/reference/com/google/android/gms/locat‌ іён/& hellip;
дададзена аўтар Osama_Almaani, крыніца

У мяне была такая ж праблема, калі, вынікаючы інструкцыям з падручнік . Па тэлефоне ён працаваў і на (Genymotion) эмулятары гэта не так.

рашэнне

У вашым AndroidManifest.xml, змяніць гэта:


да гэтага:


... і вы атрымаеце месца адразу. Няма неабходнасці, каб змяніць код (слухаць геоданных).

21
дададзена
Гэта часовае рашэнне не з'яўляецца рашэннем праблемы. Што рабіць, калі мы не хочам, каб прымусіць штраф патрабаванні аб дазволе на месца карыстальніка?
дададзена аўтар Nilzor, крыніца
У GenyMotion з GAPPS дадаў, вы таксама павінны ўключыць Месца ўстаноўкі доступу і запусціць карту Google, па меншай меры адзін раз (калі ў вас няма карты Google, вы павінны ўсталяваць яго першы з гульнявога крамы).
дададзена аўтар null, крыніца
Ня дасканалым, але гэта працуе для мяне з 7.0.1. Дзякуючы.
дададзена аўтар chrjs, крыніца
Я выкарыстоўваю той жа дазвол, але па-ранейшаму нулявое значэнне я атрымліваю.
дададзена аўтар Dhruvam Gupta, крыніца
Гэта не дапаможа мне
дададзена аўтар Androider, крыніца
Я дадаў абодва дазволу. Гэта зафіксаваў яго. Выгляд па-дурному, калі Google у сваіх дакументах канкрэтна сказаў штраф месца не патрабуецца.
дададзена аўтар Ronen Festinger, крыніца
@Nilzor - гэта, верагодна, не выкарыстоўваць для вас больш, улічваючы час, што гэта прайшло, але (калі вы працуеце з Android Studio, па меншай меры), вы можаце стварыць AndroidManifest.xml пад Src/адладкі, якія будуць атрымліваць аб'яднаны ў галоўны маніфест для адладкі будуе, але не будзе аб'яднаны для версіі рэлізу. Можа быць, гэта дапаможа камусьці яшчэ з той жа праблемай у будучыні ...
дададзена аўтар Zac Seth, крыніца
Гэта рашэнне, якое працуе для мяне.
дададзена аўтар gvijay, крыніца
працуючы зачараванне ДА marshmello, але і забяспечвае нулявое ў Ногат
дададзена аўтар Sanket, крыніца

The issue can also be caused by your device does not have "Wi-Fi & mobile network location" enabled.

LocationClient (плаўлены пастаўшчык месцазнаходжання) выкарыстоўвае як GPS і Wi-Fi. GPS займае некаторы час, каб знайсці месца ў той час як Wi-Fi значна хутчэй. Аднак, калі адзін з гэтых 2-х паслуг звязана, выклік метад зваротнага onConnected будзе называцца. І калі вы спрабуеце выклікаць LocationClient.getLastLocation() у onConnected метаду адразу, у асноўным гэта верагоднасць таго, што вы атрымаеце нулявое значэнне, калі ваш сэрвіс WiFi месцазнаходжаньня адключаны. Гэта проста таму, што GPS проста не дастаткова хутка.

To solve the problem for yourself locally, enable "Wi-Fi & mobile network location". You can do it by going to "Settings > Personal > Location access > Wi-Fi & mobile network location".

Тым не менш, калі вы хочаце, каб вырашыць гэтую праблему для карыстальнікаў вашага прыкладання, вы б лепш праверыць, вяртае Ці getLastLocation() нуля. Калі гэта робіць, падкажыце ваш карыстачу ўключыць паслугу гэтак жа, як Google Map робіць.

Спадзяюся, што дапамагае.

16
дададзена
@John гэта здарылася са мной на некалькі occations ў развіцці, і я падазраю, што і вытворчасць. Тым не менш у пошуках рашэнняў, так крычыце, калі вы знайшлі.
дададзена аўтар Nilzor, крыніца
Я толькі што быў выпадак, калі getLastLocation() вяртала нулявое значэнне, калі адключаная GPS. Нават калі наладкі размяшчэння дазваляюць усё вяртаецца ў любы час NULL, і я ніколі не атрымаць абнаўленне месцазнаходжання на ўсіх. Калі ўключыць GPS ён зноў працуе. Свежы перазапуск дадатку не вырашыць гэтую праблему. Перазагружаем тэлефон, аднак зрабіў перыядычныя абнаўлення магчымых зноў, нават без GPS. На дадзены момант я думаю, што гэта можа быць магчыма, што Play Service зліць размяшчэнне API не так надзейна, як інтэграваныя адзін.
дададзена аўтар John, крыніца
Я ведаю пра гэта. Я проста паспрабаваў дадаць, што я сутыкнуўся з такой праблемай, незалежна ад Wi-Fi і мабільнай сеткі месцазнаходжанне ўключана. Паслугі Play месцазнаходжанне Google нейкім чынам затрымаўся ўнутры і толькі перазагрузка самага тэлефона прывёў яго назад у нармальнае рэчышча. Да гэтага часу гэта было толькі адзін раз да мяне.
дададзена аўтар John, крыніца
Хм ... Я не, калі я чытаю ваш каментар правільна. Так што я можа няправільна зразумець вас. Калі вы больш уважліва прачытаць мой адказ, вы зразумееце, што вам не трэба GPS уключаны. Гэта больш пра вашым «Wi-Fi і мабільная сетка месцазнаходжанні» уключаны. Гэта хутчэй, чым GPS і павінны быць больш надзейнымі ў гарадской мясцовасці. Дайце мне ведаць, калі я не мае рацыю. =)
дададзена аўтар Tim Hong, крыніца

Я сутыкнуўся з аналагічнай праблемай.

Выклік mLocationClient.getLastLocation() у onConnected або пасля падлучэння да Google Play Services была створана. Калі вы выклікаеце гэты метад да месцазнаходжання кліента падлучаны, то месца будзе вернута нулявым .

Вы можаце праверыць, калі кліент размяшчэнне звязана з mLocationClient.isConnected() .

Спадзяюся, што гэта дапамагае.

8
дададзена

Вы павінны праверыць, калі карыстальнік актываваў месцазнаходжанне з дапамогай Wi-Fi/GSM або GPS. Калі няма якіх-небудзь наяўных дадзеных пра месцазнаходжанне, вы атрымаеце Null .

Гэты код адлюстроўвае экран налады месцазнаходжання:

startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
5
дададзена
лакальныя налады выглядае добра. гэта толькі здаецца, што я павінен чакаць змены месцазнаходжання - дзякуй вялікі
дададзена аўтар oscarthecat, крыніца

Гэта дакладна працоўны раствор, probaly ў невялікіх розных абставінах. Але я хацеў бы дадаць некаторыя маленькія крокі тлумачэння так, што хтосьці атрымлівае строга паняццi:

1) OnCreate() з Android кампанента (напрыклад, <�моцны> Дзейнасць , <�моцны> Фрагмент або <�моцны> Сэрвіс . Заўвага: Не IntentService ) <�моцны> пабудаваць , а затым <�моцны> падключыць GoogleApiClient, як паказана ніжэй.

buildGoogleApiClient();
mGoogleApiClient.connect();

дзе, рэалізацыя buildGoogleApiClient() з'яўляецца,

protected synchronized void buildGoogleApiClient() {
        Log.i(TAG, "Building GoogleApiClient");

        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();

    }

Пазней OnDestroy (), вы можаце адключыць GoogleApiClient, як,

@Override
    public void onDestroy() {
        Log.i(TAG, "Service destroyed!");
        mGoogleApiClient.disconnect();
        super.onDestroy();
    }

<�Моцны> Крок 1 робіць, што вы будуеце і падключыць GoogleApiClient.

1) GoogleApiClient асобнік першы раз падключаецца па метадзе onConnected (). Зараз, ваш наступны крок павінен выглядаць метад onConnected ().

@Override
    public void onConnected(@Nullable Bundle bundle) {
        Log.i(TAG, "GoogleApiClient connected!");
        buildLocationSettingsRequest();
        createLocationRequest();
        location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
        Log.i(TAG, " Location: " + location); //may return **null** because, I can't guarantee location has been changed immmediately 
    }

Вышэй вы назвалі метад <�моцны> createLocationRequest() для стварэння запыту месцазнаходжаньня. Метад <�моцны> createLocationRequest() выглядае, як паказана ніжэй.

protected void createLocationRequest() {
        //remove location updates so that it resets
        LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); //Import should not be **android.Location.LocationListener**
    //import should be **import com.google.android.gms.location.LocationListener**;

        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(10000);
        mLocationRequest.setFastestInterval(5000);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        //restart location updates with the new interval
        LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);

    }

3) Зараз на onLocationChange() зваротнага выкліку інтэрфейсу LocationListener, вы атрымаеце новае месцазнаходжанне.

@Override
    public void onLocationChanged(Location location) {
        Log.i(TAG, "Location Changed!");
        Log.i(TAG, " Location: " + location); //I guarantee,I get the changed location here

    }

You get the result like this in Logcat: 03-22 18:34:17.336 817-817/com.LiveEarthquakesAlerts I/LocationTracker: Location: Location[fused 37.421998,-122.084000 acc=20 et=+15m35s840ms alt=0.0]

Для таго, каб быць у стане зрабіць гэтыя тры крокі, вы павінны наладзіце build.gradle, як паказана ніжэй:

 compile 'com.google.android.gms:play-services-location:10.2.1'
5
дададзена

Я сутыкаўся з падобнымі праблемамі на маіх тэстах з тэлефонамі Samsung (высока персаналізаваным андроідам, і без падтрымкі распрацоўшчыкаў).

LocationManager і LocationClient не атрымаеце GPS ад пастаўшчыкоў. Яны павінны быць kickstarted кожны раз, калі вам трэба месца ад іх. Зрабіце гэта, перш чым ваш LocationManager.getLastKnownLocation АБО LocationClient.getLastLocation званкі. Гэтыя інтэрфейсы API вернуцца.

YOUR_APPLICATION_CONTEXT.getLocationManager().requestLocationUpdates(
    LocationManager.NETWORK_PROVIDER, 0, 0, new LocationListener() {
        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
        }
        @Override
        public void onProviderEnabled(String provider) {
        }
        @Override
        public void onProviderDisabled(String provider) {
        }
        @Override
        public void onLocationChanged(final Location location) {
        }
    });
4
дададзена
HI, я не перазагружаць свой тэлефон Самсунга, ён аўтаматычна пачаў працаваць без якіх-небудзь змяненняў, я не не тое, што была праблема. Акрамя таго, адна рэч, якую я заўважыў, перш чым паўторна загрузкі, яно працуе выдатна падыходзіць для ўжывання карты па змаўчанні. Я сутыкнуўся гэтае пытанне толькі ў маім Samsung S дуэтаў тэлефон
дададзена аўтар Naruto, крыніца
HI Homescreen што? гэта кантэкст прыкладання?
дададзена аўтар Naruto, крыніца
Upvote звычка мне балюча :)
дададзена аўтар Siddharth, крыніца
Перазагрузка ініцыюе абнаўленне кэша. Праверце гэта пасля таго, як рухаецца вакол трохі (100 метраў). Infact проста стварыць таймер для друку бягучага месцазнаходжання GPS кожныя 5 секунд і рухацца вакол вашай мясцовасці. DONT нагрузкі Google Map прыкладанне. Або любой іншай карце прыкладанне. Гэта будзе сапраўдным выпрабаваннем.
дададзена аўтар Siddharth, крыніца
Так, яго кантэкст прыкладання
дададзена аўтар Siddharth, крыніца
Гэта ўсталяваў яе для мяне.
дададзена аўтар MartinMarco, крыніца

Па версіі SDK 23

Вы таксама павінны <�моцны> відавочна запытаць дазвол месцазнаходжаньня падчас выканання , у адпаведнасці з https://developer.android.com/training/permissions/requesting.html а таксама мець яго ў файле маніфесту.

Няма яўнага памылка не адбудзецца, калі вы не маеце права доступу падчас выканання, пастаўшчык месца будзе проста вяртаць нуль.

Гэта дапамагло б, калі Google дакументальна гэта, а таксама згенеруе выключэнне, а не проста вяртаецца нуль. Вяртанне нулявога пра найменш карыснай рэчы, каб зрабіць у гэтай сітуацыі.

3
дададзена
Ці вы можаце падаць дазвол ад налад прыкладання ў відавочным выглядзе
дададзена аўтар Adil Mammadov, крыніца

Я таксама сутыкаюся з тымі ж праблемамі ў маім дадатку, і толькі якое адсутнічае было тое, што прыкладанне прасіў толькі для ACCESS_COARSE_LOCATION і ня ACCESS_FINE_LOCATION. Я дадаў пазней дазвол і ўсё працавала нармальна.

2
дададзена

Самае простае рашэнне праблемы, хоць і запавольвае яго крыху, каб выкарыстоўваць дапаможную функцыю. Мая праблема была ў тым, што ён будзе падлучацца, але да таго, як было знойдзена месца, я хацеў бы паспрабаваць атрымаць доступ да яго і ўдарыў пустой паказальнік.

public Location getLocation(LocationClient locationClient){

    if(locationClient.getLastLocation() == null){
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return getLocation(locationClient);
    }else{
        return locationClient.getLastLocation();
    }
}

Проста выкарыстоўвайце гэта ў onConnected </кодзе> і ўсталяваць ўсе, што вы хацелі месца, каб выкарыстоўваць гэтую функцыю, перадаючы свой кліент месцазнаходжаньня.

@Override
public void onConnected(Bundle dataBundle) {

    Location temp = getLocation(mLocationClient);
    mLocation = temp;
}

Акрамя таго, калі вы не хочаце, каб атрымаць размяшчэнне ад onConnected па якой-небудзь прычыне, вы можаце выкарыстоўваць тую ж дапаможную функцыю ў любым месцы да тых часоў, як вы перадаеце свой locationClient .

2
дададзена
Не добра? Ён быў досыць добры, каб назваць гэты сайт!
дададзена аўтар colmde, крыніца
самы просты спосаб атрымаць ANR ...
дададзена аўтар Selvin, крыніца
Вы штабелирования рэкурсіўны выклік на getLocation кожную секунду?. Гэта не добра.
дададзена аўтар Mar Bar, крыніца

Я бягу і яго працы дасканалы ў Nexus 7 прылады. Вы, хлопцы, па памылцы напісалі старую версію LocationListener, які не выкарыстоўваецца з новым API.

Вы павінны ўсталяваць з новым LocationListener.

Вы павінны імпартаваць гэты клас, а затым паспрабаваць.

import com.google.android.gms.location.LocationListener;

І гэта перавызначыць толькі адзін метад у адпаведнасці з новым API

@Override
public void onLocationChanged(final Location newLocation) 
{}

Калі ласка, паспрабуйце гэты шлях, і дайце мне ведаць, калі вы па-ранейшаму сутыкаецеся з якім-небудзь пытаннем.

Дзякуючы.

1
дададзена

<�Моцны> Вам проста трэба запыт на абнаўленне для размяшчэння. Калі з 26 Android SDK ўсе дазволу нармальна:

private void setLocation(Context context) {
    GoogleApiClient googleApiClient = new GoogleApiClient.Builder(context)
            .addApi(LocationServices.API).build();
    googleApiClient.connect();

     locationRequest = LocationRequest.create();
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    locationRequest.setInterval(2000);
    locationRequest.setFastestInterval(2000);

    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder().addLocationRequest(locationRequest);
    builder.setAlwaysShow(true);
    PendingResult result = LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build());
    result.setResultCallback(new ResultCallback() {
        @Override
        public void onResult(LocationSettingsResult result) {
            final Status status = result.getStatus();
            switch (status.getStatusCode()) {
                case LocationSettingsStatusCodes.SUCCESS:
                    showMessage(" All location settings are satisfied.");
                    mGoogleApiClient = new GoogleApiClient.Builder(MainActivity.this)
                            .addApi(LocationServices.API)
                            .addConnectionCallbacks(connectionCallbacks)
                            .addOnConnectionFailedListener(connectionFailedListener)
                            .build();
                            mGoogleApiClient.connect();
                    break;
                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                    l.a(" Location settings are not satisfied. Show the user a dialog to upgrade location settings ");

                    try {
                       //Show the dialog by calling startResolutionForResult(), and check the result
                       //in onActivityResult().
                        status.startResolutionForResult(MainActivity.this, REQUEST_CHECK_SETTINGS);
                    } catch (IntentSender.SendIntentException e) {
                        showMessage("PendingIntent unable to execute request.");
                    }
                    break;
                case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                    showMessage("Location settings are inadequate, and cannot be fixed here. Dialog not created.");
                    break;
            }
        }
    });
}

і ў onConnected метаду зваротнага выкліку:

 @Override
    public void onConnected(@Nullable Bundle bundle) {
        l.a(3232);
        if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) !=
                PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                   return;
        }

            mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
                    mGoogleApiClient);
       if(null==mLastLocation){//  !!!!!!!!!!!! here it can happen !!!!!!!

                    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, locationRequest, new LocationListener() {
                        @Override
                        public void onLocationChanged(Location location) {
                            mLastLocation = location;
                            locationWasFound = true;
                            sevumPora.setLocation(mLastLocation);
                            mGoogleApiClient.disconnect();
                        }
                    });
                return;
            }
        locationWasFound = true;
        sevumPora.setLocation(mLastLocation);
        mGoogleApiClient.disconnect();
    }
0
дададзена

Google гульні службы геолокации не можа працаваць без падлучэння да інтэрнэту, індыферэнтна для GPS. Таму, калі ласка, праверце прыкладанне з мабільнай перадачы дадзеных ўключана.

0
дададзена