[Android] Aplikacja kończy działanie, gdy próbuję pobrać aktualną lokalizację

0

Dzień dobry,

Chcę napisać aplikację, która wyświetla aktualne położenie. Jednak po naciśnięciu buttona zamiast danych o lokalizacji aplikacja jest zatrzymywana. Przeglądam kod, ale nigdzie nie mogę zlokalizować błędu, więc może ktoś bardziej doświadczony zauważy co jest nie tak. Aplikację testuję na Androidzie 5.1.

public class MainActivity extends AppCompatActivity {
    static final int LOCATION_REQUEST_PERMISSION = 101;
    TextView dostawca;
    TextView dlugosc;
    TextView szerokosc;
    Criteria cr = new Criteria();
    Location loc;
    String mojDostawca;
    LocationManager mylm;
    Button start;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        dostawca = (TextView) findViewById(R.id.textView1);
        dlugosc = (TextView) findViewById(R.id.textView2);
        szerokosc = (TextView) findViewById(R.id.textView3);
        start = (Button) findViewById(R.id.start);

        int internetLocationPermissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.INTERNET);
        int fineLocationPermissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION);
        int coarseLocationPermissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION);

        if (internetLocationPermissionCheck != PackageManager.PERMISSION_GRANTED || fineLocationPermissionCheck != PackageManager.PERMISSION_GRANTED || coarseLocationPermissionCheck != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.INTERNET, android.Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_REQUEST_PERMISSION);
        } else {
            start.setOnClickListener(new View.OnClickListener() {
                @SuppressWarnings("MissingPermission")
                @Override
                public void onClick(View v) {
                    getLokalizacja();
                    getDostawca();
                    getLokalizacjaDostawcy();
                    infoLokalizacja();
                }
            });

            getLokalizacja();
            getDostawca();
            mylm.requestLocationUpdates(mojDostawca, 400, 1, new LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
                    getLokalizacjaDostawcy();
                    infoLokalizacja();
                }

                @Override
                public void onStatusChanged(String provider, int status, Bundle extras) {

                }

                @Override
                public void onProviderEnabled(String provider) {

                }

                @Override
                public void onProviderDisabled(String provider) {

                }
            });
        }
    }

    void getLokalizacja() {
        mylm = (LocationManager) getSystemService(LOCATION_SERVICE);
    }

    void getDostawca() {
        mojDostawca = mylm.getBestProvider(cr, true);
    }

    @SuppressWarnings("MissingPermission")
    void getLokalizacjaDostawcy() {
        loc = mylm.getLastKnownLocation(mojDostawca);
    }

    void infoLokalizacja() {
        dostawca.setText("dostawca: " + mojDostawca);
        dlugosc.setText("dlugosc geograficzna: " + loc.getLongitude());
        szerokosc.setText("szerokosc geograficzna: " + loc.getLatitude());
    }
}
0

lokacja ci zwraca nulla, zrób ifa który sprawdza czy lokacja to null

0

Wstawienie if'a pomogło. Aplikacja się nie zatrzymuje, ale w dalszym ciągu nie jest pobierana lokalizacja, czy to może być wina urządzenia?

0

a masz włączone gps czy internet czy co?

0

GPS, Wi-Fi, Komórkowa transmisja danych. Wszystko włączone.

0

wymuś po prostu location updates i tyle co np. jakiś czas

0

Uprawnienia do lokalizacji przyznane?

0

Dodałem takie uprawnienia:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
0

Raz na miesiąc mogę się naprodukować...
Standardowy exception dla próby wywołania metody na niezainicjowanym obiekcie.

Totalnie nie chce mi się sprawdzać, więc strzelę, że metoda getLastKnownLocation(Location loc) zwraca: ostatnia znana lokalizacja ALBO null jeżeli jej nie ma.
Tyle i aż tyle.

Poza tym:

  1. co to robi w onCreate MAINACTIVITY - oddzielna klasa na to;

  2. pobieranie lokalizacji jest procesem asynchronicznym - jak nie wiesz co to, to przeczytaj o tym oraz zastosuj poniższe rady ( 3)....) jeżeli nie chcesz natykać się na null co parę linijek kodu

  3. jeżeli chcesz sobie odpalić szukanie lokalizacji, to zrób to z onResume a nie onCreate;

  4. zrób to za pomocą podstawowego asyncTask + callback za pomocą interfejsu jeżeli jesteś początkujący ( zwracanie lokalizacji oczywiście);

  5. lepiej zrób 4) za pomocą RxJava / RxAndroid

  6. zablokuj możliwość kliknięcia/ majstrowania z lokalizacją dopóki nie otrzymasz informacji zwrotnej z lokalizacją z odpalonego procesu asynchronicznego za pomocą callbacku albo z Rx- ważne

  7. w ogóle dopiero jak otrzymasz lokalizację, wtedy cokolwiek ustawiaj w widgetach

  8. PAMIĘTAJ: to, że coś działa ci teraz wcale nie znaczy, że działać musi... widzę kilkanaście sytuacji, że mogłoby ci się to posypać z powodu trzymania tego na jednym wątku, oraz... szkoda rozpisywać się

  9. nazwy? to zwracasz lokalizację czy LocationManager?

void getLokalizacja() {
        mylm = (LocationManager) getSystemService(LOCATION_SERVICE);
    }
  1. bezstrosko operujesz dostawcą... a co jak getBestProvider zwróci nulla?
void getDostawca() {
        mojDostawca = mylm.getBestProvider(cr, true);
    }

void getLokalizacjaDostawcy() {
        loc = mylm.getLastKnownLocation(mojDostawca);
    }
  1. dlaczego nie przypiszesz zmiennej zwracanej w onLocationChanged jako Location loc?
    dwie linijki dalej zwracasz tę samę zmienną za pomocą wywołania metody getLastKnownLocation
             public void onLocationChanged(Location location) {
                    getLokalizacjaDostawcy();
                    infoLokalizacja();
                }

    @SuppressWarnings("MissingPermission")
    void getLokalizacjaDostawcy() {
        loc = mylm.getLastKnownLocation(mojDostawca);
    }
  1. Uhmmm
@SuppressWarnings("MissingPermission")
  1. inglisz inglisz inglisz

  2. podam może trochę spaghetti przykład bo te dwie klasy są zakręcone jak muszla po ogórkach, ale łap z mojego starego projektu którego nie mam ochoty poprawiać ( no może za kilka miesięcy się zmotywuję)
    gps location listener i chyba klasa do której zwraca lokalizację; jak bystry jesteś to dasz radę
    https://github.com/GregoryIwanek/AltiMeter/blob/master/app/src/main/java/pl/gregoryiwanek/altimeter/app/data/location/services/elevation/GpsLocationListener.java
    https://github.com/GregoryIwanek/AltiMeter/blob/master/app/src/main/java/pl/gregoryiwanek/altimeter/app/data/location/LocationUpdateManager.java

  3. powodzenia

  4. ostatnia rzecz: instalujesz aplikacje na fizycznym telefonie czy emulatorze? Tyle podpowiedzi

1 użytkowników online, w tym zalogowanych: 0, gości: 1