Jak sprawdzić, czy GPS urządzenia z Androidem jest włączony

Odpowiedzi:

456

Najlepszym sposobem wydaje się być:

 final LocationManager manager = (LocationManager) getSystemService( Context.LOCATION_SERVICE );

    if ( !manager.isProviderEnabled( LocationManager.GPS_PROVIDER ) ) {
        buildAlertMessageNoGps();
    }

  private void buildAlertMessageNoGps() {
    final AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Your GPS seems to be disabled, do you want to enable it?")
           .setCancelable(false)
           .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
               public void onClick(@SuppressWarnings("unused") final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
                   startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
               }
           })
           .setNegativeButton("No", new DialogInterface.OnClickListener() {
               public void onClick(final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
                    dialog.cancel();
               }
           });
    final AlertDialog alert = builder.create();
    alert.show();
}
Marcus
źródło
1
Chodzi przede wszystkim o odpalenie zamiaru zobaczenia konfiguracji GPS, zobacz szczegóły na github.com/marcust/HHPT/blob/master/src/org/thiesen/hhpt/ui/ ...
Marcus
3
Niezły fragment kodu. Usunąłem @SuppressWarnings i nie otrzymuję żadnych ostrzeżeń ... może są one niepotrzebne?
rozpiętość
30
Radzę zadeklarować alertcałą aktywność, abyś mógł ją zamknąć w onDestroy, aby uniknąć wycieku pamięci ( if(alert != null) { alert.dismiss(); })
Cameron
Co więc, jeśli korzystam z oszczędzania baterii, czy to nadal będzie działać?
Prakhar Mohan Srivastava
3
@PrakharMohanSrivastava, jeśli ustawienia lokalizacji są włączone w trybie oszczędzania energii, to zwróci fałsz, jednak LocationManager.NETWORK_PROVIDERzwróci prawdę
Tim
129

W Androidzie możemy łatwo sprawdzić, czy GPS jest włączony w urządzeniu, czy nie przy użyciu Menedżera lokalizacji.

Oto prosty program do sprawdzenia.

GPS włączony lub nie: - Dodaj poniższy wiersz uprawnień użytkownika w AndroidManifest.xml, aby uzyskać dostęp do lokalizacji

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

Twój plik klasy Java powinien być

public class ExampleApp extends Activity {
    /** Called when the activity is first created. */
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

        if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
            Toast.makeText(this, "GPS is Enabled in your devide", Toast.LENGTH_SHORT).show();
        }else{
            showGPSDisabledAlertToUser();
        }
    }

    private void showGPSDisabledAlertToUser(){
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
        alertDialogBuilder.setMessage("GPS is disabled in your device. Would you like to enable it?")
        .setCancelable(false)
        .setPositiveButton("Goto Settings Page To Enable GPS",
                new DialogInterface.OnClickListener(){
            public void onClick(DialogInterface dialog, int id){
                Intent callGPSSettingIntent = new Intent(
                        android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                startActivity(callGPSSettingIntent);
            }
        });
        alertDialogBuilder.setNegativeButton("Cancel",
                new DialogInterface.OnClickListener(){
            public void onClick(DialogInterface dialog, int id){
                dialog.cancel();
            }
        });
        AlertDialog alert = alertDialogBuilder.create();
        alert.show();
    }
}

Wynik będzie wyglądał

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

beryl
źródło
1
Nic nie dzieje się, gdy wypróbuję twoją funkcję. Jednak nie otrzymałem żadnych błędów podczas testowania.
Airikr
Mam to działa! :) Wielkie dzięki, ale nie mogę głosować, dopóki nie
zredagujesz
3
nie ma problemu @Erik Edgren masz rozwiązanie więc jestem szczęśliwy Ciesz się ... !!
@ user647826: Doskonale! Działa ładnie. Uratowałeś mi noc
Addi
1
Porada: zadeklaruj alertcałą aktywność, abyś mógł ją zamknąć, onDestroy()aby uniknąć wycieku pamięci ( if(alert != null) { alert.dismiss(); })
naXa
38

tak, ustawień GPS nie można już zmienić programowo, ponieważ są to ustawienia prywatności i musimy sprawdzić, czy są włączone w programie, czy nie, i obsłużyć je, jeśli nie są włączone. możesz powiadomić użytkownika, że ​​GPS jest wyłączony i użyć czegoś takiego, aby wyświetlić użytkownikowi ekran ustawień, jeśli chcesz.

Sprawdź, czy dostawcy lokalizacji są dostępni

    String provider = Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
    if(provider != null){
        Log.v(TAG, " Location providers: "+provider);
        //Start searching for location and update the location text when update available
        startFetchingLocation();
    }else{
        // Notify users and show settings if they want to enable GPS
    }

Jeśli użytkownik chce włączyć GPS, może wyświetlić ekran ustawień w ten sposób.

Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivityForResult(intent, REQUEST_CODE);

W swoim onActivityResult możesz sprawdzić, czy użytkownik ją włączył

    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        if(requestCode == REQUEST_CODE && resultCode == 0){
            String provider = Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
            if(provider != null){
                Log.v(TAG, " Location providers: "+provider);
                //Start searching for location and update the location text when update available. 
// Do whatever you want
                startFetchingLocation();
            }else{
                //Users did not switch on the GPS
            }
        }
    }

To jeden ze sposobów, aby to zrobić i mam nadzieję, że to pomoże. Daj mi znać, jeśli robię coś źle.

osiągnąć
źródło
2
cześć, mam podobny problem ... czy możesz krótko wyjaśnić, co to jest „REQUEST_CODE” i do czego służy?
poeschlorn
2
@poeschlorn Anna opublikowała link do szczegółowych poniżej. Mówiąc prościej, RequestCode umożliwia korzystanie startActivityForResultz wielu celów. Kiedy zamiary powrócą do twojej aktywności, sprawdzasz RequestCode, aby zobaczyć, które zamiary powracają i odpowiednio reagujesz.
Farray
2
providerMoże być pusty. Musiałem zmienić czek na(provider != null && !provider.isEmpty())
Pawan,
Ponieważ dostawca może być „”, rozważ użycie int mode = Settings.Secure.getInt (getContentResolver (), Settings.Secure.LOCATION_MODE); Jeśli tryb = 0 GPS jest wyłączony
Levon Petrosyan
31

Oto kroki:

Krok 1: Utwórz usługi działające w tle.

Krok 2: Wymagane są także następujące uprawnienia w pliku manifestu:

android.permission.ACCESS_FINE_LOCATION

Krok 3: Napisz kod:

 final LocationManager manager = (LocationManager)context.getSystemService    (Context.LOCATION_SERVICE );

if ( !manager.isProviderEnabled( LocationManager.GPS_PROVIDER ) )
  Toast.makeText(context, "GPS is disabled!", Toast.LENGTH_LONG).show(); 
else
  Toast.makeText(context, "GPS is enabled!", Toast.LENGTH_LONG).show();

Krok 4: Lub po prostu możesz sprawdzić za pomocą:

LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE );
boolean statusOfGPS = manager.isProviderEnabled(LocationManager.GPS_PROVIDER);

Krok 5: Uruchom swoje usługi w sposób ciągły, aby monitorować połączenie.

Rakesh
źródło
5
Mówi, że GPS jest włączony, nawet gdy jest wyłączony.
Ivan V
15

Tak, możesz sprawdzić poniżej to kod:

public boolean isGPSEnabled (Context mContext){
    LocationManager locationManager = (LocationManager)
                mContext.getSystemService(Context.LOCATION_SERVICE);
    return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
}
Arun Kumar
źródło
9

Ta metoda korzysta z usługi LocationManager .

Link źródłowy

//Check GPS Status true/false
public static boolean checkGPSStatus(Context context){
    LocationManager manager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE );
    boolean statusOfGPS = manager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    return statusOfGPS;
};
Code Spy
źródło
6

GPS będzie używany, jeśli użytkownik zezwolił na korzystanie z niego w ustawieniach.

Nie możesz już tego jawnie włączyć, ale nie musisz - to naprawdę ustawienie prywatności, więc nie chcesz go poprawiać. Jeśli użytkownik jest w porządku z aplikacjami uzyskującymi dokładne współrzędne, zostanie włączony. Następnie interfejs API menedżera lokalizacji użyje GPS, jeśli to możliwe.

Jeśli Twoja aplikacja naprawdę nie jest przydatna bez GPS i jest wyłączona, możesz otworzyć aplikację ustawień na prawym ekranie, używając intencji, aby użytkownik mógł ją włączyć.


źródło
6

Ten fragment kodu sprawdza status GPS

final LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE );
if ( !manager.isProviderEnabled( LocationManager.GPS_PROVIDER ) ) {
    buildAlertMessageNoGps();
}

`

kashifahmad
źródło
3

W twoim LocationListener, zaimplementuj onProviderEnabledi onProviderDisabledobsługi zdarzeń. Gdy zadzwonisz requestLocationUpdates(...), jeśli GPS jest wyłączony w telefonie, onProviderDisabledzostanie wywołany; jeśli użytkownik włączy GPS, onProviderEnabledzostanie wywołany.

Ahmad Pourbafrani
źródło
2
In Kotlin: - How to check GPS is enable or not

 val manager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
        if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            checkGPSEnable()

        } 


 private fun checkGPSEnable() {
        val dialogBuilder = AlertDialog.Builder(this)
        dialogBuilder.setMessage("Your GPS seems to be disabled, do you want to enable it?")
                .setCancelable(false)
                .setPositiveButton("Yes", DialogInterface.OnClickListener { dialog, id
                    ->
                    startActivity(Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS))
                })
                .setNegativeButton("No", DialogInterface.OnClickListener { dialog, id ->
                    dialog.cancel()
                })
        val alert = dialogBuilder.create()
        alert.show()
    }
safal bhatia
źródło