Pertanyaan Bagaimana cara memeriksa keberadaan sensor GPS?


Saya sedang menulis sebuah metode yang akan mengembalikan true jika ada sensor GPS hadir dan diaktifkan, tetapi mengembalikan false jika tidak ada atau dimatikan. Ini terbukti sulit karena ...

hasSystemFeature("FEATURE_LOCATION_GPS")  // on PackageManager

Mengembalikan salah, apakah perangkat memiliki GPS atau tidak. Jadi bahkan pada perangkat yang memiliki satu, dan itu diaktifkan, itu masih mengembalikan salah. Kelihatannya salah bagi saya, tapi saya tidak bisa melihat mengapa.

isProviderEnabled("gps")   // on LocationManager

Mengembalikan nilai true, bahkan pada perangkat yang saya miliki di sini yang tidak memiliki perangkat keras GPS sama sekali. Itu juga tampaknya sangat kontra-intuitif.

Saya menerima hasil ini mungkin karena saya kehilangan sesuatu, SDK tidak intuitif, atau bahkan mungkin perangkat yang saya uji coba berperilaku aneh.

Apa yang saya rindukan?


5
2018-02-17 16:48


asal


Jawaban:


Ini harus berfungsi. Apakah ada pesan kesalahan di logcat saat Anda melakukan panggilan ini?

PackageManager pm = getPackageManager();
boolean hasGps = pm.hasSystemFeature(PackageManager.FEATURE_LOCATION_GPS);

13
2018-02-17 16:57



Jika perangkat tidak memiliki perangkat keras GPS, hal berikut ini benar:

locationManager.getProvider(LocationManager.GPS_PROVIDER) == null;

Dimana

LocationManager locationManager = (LocationManager) AppCore.context().getSystemService(Context.LOCATION_SERVICE);

Dalam kasus saya, * hasSystemFeature (PackageManager.FEATURE_LOCATION_GPS) * mengembalikan nilai true meskipun perangkat tidak memiliki GPS. Jadi itu tidak bisa diandalkan.


2
2018-04-07 16:46



Anda hasSystemFeature() mungkin selalu mengembalikan false karena FEATURE_LOCATION_GPS adalah referensi ke konstanta, dan bukan string literal. Saya yakin string saat ini secara harfiah menunjuk ke "android.hardware.location.gps".

Saya percaya apa yang Anda cari adalah sesuatu seperti ini:

LocationManager manager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
if(!manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
    //Ask the user to enable GPS
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("Location Manager");
    builder.setMessage("Would you like to enable GPS?");
    builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            //Launch settings, allowing user to make a change
            Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(i);
        }
    });
    builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            //No location service, no Activity
            finish();
        }
    });
    builder.create().show();
}

Saya menambahkan ekstra tentang AlertDialog untuk menunjukkan bahwa Anda dapat membawa pengguna ke halaman Pengaturan lokasi secara langsung agar mereka mengaktifkan GPS menggunakan Settings.ACTION_LOCATION_SOURCE_SETTINGS Niat bertindak.

Semoga itu membantu!


1
2018-02-17 17:03