Lokasi harus diaktifkan untuk Pemindaian Hemat Energi Bluetooth di Android 6.0

105

Setelah meningkatkan ke Android versi 6.0, pemindaian Bluetooth Hemat Energi (BLE) hanya akan bekerja jika layanan Lokasi diaktifkan pada perangkat. Lihat di sini untuk referensi: Bluetooth Low Energy startScan di Android 6.0 tidak menemukan perangkat

Pada dasarnya, Anda harus mengaktifkan izin untuk aplikasi dan juga untuk telepon. Apakah ini bug? Apakah mungkin untuk memindai tanpa layanan lokasi benar-benar diaktifkan? Saya tidak ingin memiliki lokasi untuk semua aplikasi saya.

EDIT Saya gagal menyebutkan bahwa saya menggunakan startScan()metode yang BluetoothLeScannerdisediakan dalam API 21. Saya setuju dengan izin kursus dan lokasi yang bagus dalam manifes yang diperlukan metode ini. Saya hanya tidak ingin pengguna aplikasi saya harus mengaktifkan layanan lokasi di perangkat mereka (GPS, dll.) Untuk menggunakan aplikasi saya.

Sebelumnya, startScan()metode ini akan berjalan dan menampilkan hasil dengan layanan Lokasi dinonaktifkan di ponsel. Namun, di Marshmallow, aplikasi yang sama akan "memindai" tetapi diam-diam gagal dan tidak mengembalikan hasil saat layanan lokasi tidak diaktifkan di ponsel dan izin lokasi kursus / bagus masih ada dalam manifes.

V-PTR
sumber
Perangkat apa yang kamu gunakan? Saya mengalami masalah yang sama dengan Moto G 2nd Generation. Moto G Generasi Pertama dan Nexus 6 berfungsi dengan baik dengan kode yang persis sama tanpa mengaktifkan layanan lokasi secara eksplisit.
shadowhorst
Saya telah memperhatikannya di perangkat apa pun yang menjalankan Marshmallow - Nexus 5X, Samsung S6, Samsung S7, LG G4
V-PTR

Jawaban:

89

Tidak, ini bukan bug.

Ini masalah dibesarkan untuk Google di mana mereka menanggapi mengatakan bahwa ini adalah perilaku yang dimaksudkan dan mereka tidak akan memperbaikinya. Mereka mengarahkan pengembang ke situs ini yang menunjukkan bahwa izin lokasi sekarang diperlukan untuk akses pengenal perangkat keras. Sekarang menjadi tanggung jawab pengembang untuk membuat penggunanya sadar akan persyaratan tersebut.

Namun, dalam masalah tersebut, itu tidak membahas mengapa layanan Lokasi (GPS, dll.) Diperlukan dan sepertinya mereka tidak akan meninjau kembali masalah untuk menjelaskan hal ini karena telah ditandai sebagai perilaku yang dimaksudkan.

Untuk menjawab bagian kedua dari pertanyaan: Ya, adalah mungkin untuk memindai tanpa mengaktifkan layanan Lokasi. Anda dapat melakukan pemindaian Bluetooth klasik menggunakan BluetoothAdapter.getDefaultAdapter().startDiscovery()dan itu akan berfungsi dengan layanan Lokasi nonaktif. Ini akan menemukan semua perangkat Bluetooth, BLE dan lainnya. Namun, perangkat BLE tidak akan memiliki catatan pemindaian yang akan mereka miliki jika terlihat sebagai hasilnya startScan().

V-PTR
sumber
12
Google mengklaim itu bukan bug membuat saya kedinginan. Sikap mereka BS biasa.
Marki
21
Ini sebenarnya bukan bug - jika pengembang aplikasi berbahaya dapat memindai suar bluetooth yang dikenal, mereka dapat mengetahui lokasi Anda tanpa menimbulkan kecurigaan pengguna dengan meminta izin lokasi. Jadi meminta akses BLE sayangnya harus diperlakukan sama dengan menanyakan lokasi kasar Anda.
ArtHare
9
Biarkan saya melihat apakah saya benar ini. Keuntungan besar dari BLE adalah bit "LE", yaitu Energi Rendah, yang berarti berkurangnya pengurasan baterai saya. Tentu saja, untuk mendapatkan penghematan tersebut, saya harus mengaktifkan GPS, yang merupakan pemborosan baterai, sehingga meniadakan penghematan daya yang mungkin saya peroleh dari penggunaan BLE. / saya menggelengkan kepala karena tidak percaya.
dgnuff
10
Ini luar biasa. Tentunya jika Google khawatir tentang pemindaian BLE yang digunakan untuk menyimpulkan lokasi, mereka seharusnya menambahkan izin terpisah untuk itu, daripada membuang bayi dengan air mandi dengan memaksa pengguna untuk mengizinkan akses GPS!
Desty
4
@ Pierre-LucPaour Memaksa untuk mengaktifkan GPS berarti aplikasi lain yang benar-benar menggunakan layanan lokasi dapat menggunakannya di belakang layar 'secara legal'. Salah satu alasan pengguna mematikan GPS secara manual adalah untuk mencegah aplikasi menggunakannya secara berkala dan menguras baterai, memaksa GPS untuk mencari Bluetooth adalah cara yang paling berlawanan dengan intuisi untuk memberi tahu pengguna bahwa lokasi mereka dapat digunakan.
Ankit
11

Saya menyelesaikan ini dengan mengatur targetSdkVersionke 22 di file Gradle. Anda harus mendeklarasikan ACCESS_COARSE_LOCATIONdi manifes, tetapi pemindaian BLE akan berfungsi meskipun pengguna menolak izin ini dari Pengaturan Aplikasi.

Ini hanyalah peretasan untuk menghindari permintaan izin lokasi. Lebih baik menargetkan versi android terbaru.

Edit

Solusi ini seharusnya tidak lagi digunakan karena Google Play akan mengharuskan aplikasi baru menargetkan setidaknya Android 8.0 (API level 26). Aplikasi harus meminta izin lokasi untuk pemindaian BLE.

JiTHiN
sumber
Terima kasih banyak! Apakah Anda memiliki ide apa yang harus dilakukan dengan perpustakaan yang mensimulasikan pemantauan seperti AltBeacon misalnya? Jangan bekerja tanpa lokasi di :( dan pada dasarnya mereka menggunakan mekanisme yang sama ... Dan bagaimana dengan versi kompilasi min? @JiTHiN
Shahar Lahav
Diturunkan dari 23 menjadi 22 dan berfungsi bahkan di Android 7.0. Masalah awal saya adalah Anda harus mengaktifkan pelokalan, sekarang saya dapat memindai perangkat BLE dengan pelokalan dinonaktifkan.
Mariusz Wiazowski
1
Ini adalah retasan, namun ini TIDAK DIANJURKAN , selalu lebih baik untuk menargetkan versi sdk terbaru. Cara yang tepat untuk melakukan hal ini adalah untuk meminta ACCESS_COARSE_LOCATIONdi runtime
Aaron
2
Ini bukan solusi lagi (lihat developer.android.com/distribute/best-practices/develop/… "Google Play akan mewajibkan aplikasi baru tersebut menargetkan setidaknya Android 8.0 (API level 26) mulai 1 Agustus 2018, dan itu pembaruan aplikasi menargetkan Android 8.0 mulai 1 November 2018. ")
Étienne
10

Apa yang saya temukan adalah setelah Android 6 Anda harus memberikan izin ACCESS_COARSE_LOCATION. Namun pada beberapa perangkat juga diperlukan layanan lokasi ponsel (GPS) Anda untuk diaktifkan, sehingga Anda dapat menemukan perangkat periferal. Saya menemukan bahwa menggunakan Nexus 5x, dengan Android 7.0.

Ivaylo Pankov
sumber
1
Sama untuk saya dengan Nexus 5x dan Android 6
dilindungi pada
Sama di Moto G5 plus dengan Android 7.1.1
RootCode
3

Saya juga mencoba ini di manifes tetapi tidak meminta izin, tidak yakin mengapa. Apakah aplikasi Anda meminta izin Lokasi saat memulai? Jika tidak, kita perlu meminta izin saat runtime .

Anda juga dapat memeriksa ini untuk menguji apakah aplikasi Anda berfungsi dengan baik:

Buka Pengaturan> Aplikasi> Aplikasi Anda> Izin dan aktifkan Lokasi lalu coba pindai hasilnya.

Lokasi akan dicantumkan di sini hanya jika Anda telah memberikan ACCESS_COARSE_LOCATION pada manifes.

Kamal Kishore
sumber
1
Ya, Anda harus secara eksplisit meminta izin pada waktu proses serta mengaktifkan layanan lokasi untuk perangkat tersebut. Tetapi saya bertanya-tanya apakah ada cara untuk melakukan pemindaian BLE tanpa harus mengaktifkan layanan lokasi atau meminta izin lokasi kursus pada waktu proses.
V-PTR
Meminta izin tidak cukup, Anda perlu memeriksa apakah layanan lokasi juga diaktifkan.
drindt
3

Anda bisa menggunakan BluetoothAdapter.startDiscovery().
Ini akan memindai Bluetooth Smart dan perangkat Bluetooth klasik, tetapi layanan lokasi tidak perlu diaktifkan.
(Anda masih membutuhkan ACCESS_COARSE_LOCATIONizin di Android 6.)

Anda dapat memanggil BluetoothDevice.getTypeperangkat yang ditemukan untuk memfilter perangkat Bluetooth Smart / Low Energy.

Noctis
sumber
0

Nah, saya telah melihat kode saya yang tertulis di Eclipse dan saya menggunakan fungsi startScan (API 21) di sana tanpa mendeklarasikan hal-hal lokasi dalam file manifes. Saya masih mendapatkan panggilan balik yang tepat. Sudahkah Anda mencoba menjalankan kode tanpa deklarasi lokasi? Di sisi lain - Anda dapat menggunakan startLeScan (API 18) yang tidak digunakan lagi yang tidak memerlukan izin ini. Namun, menurut saya mencari dan membaca karakteristik yang diinginkan dalam layanan lebih rumit dengan metode API 18.

Michał Dobi Dobrzański
sumber
Saya menggunakan startScanfungsi di BluetoothLeScanner. Saya sengaja menggunakan metode yang tidak digunakan lagi. Faktanya, saya memeriksa perangkat yang menggunakan API lebih besar dari 21 untuk secara khusus menggunakan metode baru yang disediakan. Saya mencoba tanpa lokasi dan gagal begitu saja. Pemindaian berjalan tetapi tidak ada yang dikembalikan (menggunakan metode pasca-API 21)
V-PTR
0

Dari apa yang saya perhatikan baru-baru ini di android 8.0, tidak perlu menyalakan GPS Anda untuk melakukan BLE Scan, tetapi Anda harus mendeklarasikannya dalam manifes, tetapi pengguna harus mengizinkan izin.

Android akan meminta pengguna untuk memberikan izin lokasi saat Anda mencoba melakukan pemindaian dengan startScan()metode. Pemindaian Anda akan gagal jika izin tidak diizinkan.

Lee Boon Kong
sumber