Saya mencoba menampilkan koordinat GPS saat saya mengklik tombol di tata letak aktivitas saya. Berikut ini adalah metode yang dipanggil ketika saya mengklik tombol:
public void getLocation(View view) {
TextView tv = (TextView) findViewById(R.id.gps_coord_view);
LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);
Location loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
tv.setText("Latitude: " + loc.getLatitude() + "\nLongitude: " + loc.getLongitude());
}
Saya mendapatkan pesan kesalahan yang mengatakan
Panggilan membutuhkan izin yang mungkin ditolak oleh pengguna. Kode harus secara eksplisit memeriksa untuk melihat apakah izin tersedia.
Saya telah memberikan izin ini di saya AndroidManifest
. Kesalahan diatasi dan aplikasi dikompilasi ketika saya menambahkan yang berikut ini sebelum memanggil lm.getLastKnownLocation
:
if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
Namun, aplikasi macet saat saya menekan tombol yang memanggil getLocation saat diklik. Apa yang sedang terjadi? Apakah ada cara yang lebih baik / lebih sederhana untuk mengambil koordinat GPS perangkat?
android
locationmanager
pengguna
sumber
sumber
Jawaban:
Dengan Android API level (23), kami diminta untuk memeriksa izin. https://developer.android.com/training/permissions/requesting.html
Saya mengalami masalah yang sama, tetapi hal berikut berhasil untuk saya dan saya berhasil mengambil data Lokasi:
(1) Pastikan Anda memiliki izin yang tercantum di Manifes:
(2) Pastikan Anda meminta izin dari pengguna:
(3) Pastikan Anda menggunakan ContextCompat karena ini memiliki kompatibilitas dengan level API yang lebih lama.
(4) Di layanan lokasi Anda, atau kelas yang menginisialisasi LocationManager Anda dan mendapatkan lokasi terakhir yang diketahui, kami perlu memeriksa izinnya:
(5) Pendekatan ini hanya berfungsi untuk saya setelah saya menyertakan @TargetApi (23) di bagian atas metode initLocationService saya.
(6) Saya juga menambahkan ini ke build gradle saya:
Ini adalah LocationService saya untuk referensi:
Saya menguji dengan perangkat Android Lollipop sejauh ini saja. Semoga ini berhasil untuk Anda.
sumber
SOLUSI SEDERHANA
Saya ingin mendukung aplikasi sebelum api 23 dan alih-alih menggunakan,
checkSelfPermission
saya menggunakan coba / tangkapsumber
Bagian terakhir dari pesan kesalahan yang Anda kutip menyatakan:
...with ("checkPermission") or explicitly handle a potential "SecurityException"
Cara yang lebih cepat / sederhana untuk memeriksa apakah Anda memiliki izin adalah dengan mengelilingi kode Anda
try { ... } catch (SecurityException e) { [insert error handling code here] }
. Jika Anda memiliki izin, bagian 'coba' akan dijalankan, jika tidak, bagian 'tangkap' akan.sumber
Gunakan kelas custome saya untuk memeriksa atau meminta izin
sumber
jika Anda bekerja pada izin dinamis dan izin seperti ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION memberikan kesalahan "tidak dapat menyelesaikan metode PERMISSION_NAME" dalam hal ini tulis kode Anda dengan nama izin dan kemudian membangun kembali proyek Anda ini akan membuat kembali file manifes (Manifest.permission).
sumber
Jika Anda hanya ingin memeriksa izin (daripada meminta izin), saya menulis ekstensi sederhana seperti ini:
Sekarang, jika saya ingin memeriksa izin, saya cukup memberikan izin seperti ini:
sumber