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 BluetoothLeScanner
disediakan 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.
Jawaban:
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 hasilnyastartScan()
.sumber
Saya menyelesaikan ini dengan mengatur
targetSdkVersion
ke 22 di file Gradle. Anda harus mendeklarasikanACCESS_COARSE_LOCATION
di 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.
sumber
ACCESS_COARSE_LOCATION
di runtimeApa 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.
sumber
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.
sumber
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_LOCATION
izin di Android 6.)Anda dapat memanggil
BluetoothDevice.getType
perangkat yang ditemukan untuk memfilter perangkat Bluetooth Smart / Low Energy.sumber
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.
sumber
startScan
fungsi diBluetoothLeScanner
. 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)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.sumber
Anda dapat memindai perangkat BLE tanpa akses lokasi menggunakan CompanionDeviceManager (API26). https://developer.android.com/reference/android/companion/CompanionDeviceManager .
sumber