Android 6.0'da Bluetooth Düşük Enerjili Tarama için konumun etkinleştirilmesi gerekiyor


105

Android 6.0 sürümüne yükselttikten sonra Bluetooth Düşük Enerji (BLE) taraması yalnızca cihazda Konum hizmetleri etkinse çalışacaktır. Referans için buraya bakın: Android 6.0'da Bluetooth Düşük Enerji startScan cihazları bulamıyor

Temel olarak, uygulama için olduğu kadar telefon için de izninizin etkinleştirilmiş olması gerekir. Bu bir hata mı? Konum hizmetleri gerçekten etkinleştirilmeden tarama yapmak mümkün müdür? Tüm uygulamalarım için konuma sahip olmak istemiyorum.

DÜZENLE API 21'de sağlanan startScan()yöntemi kullandığımı belirtmedim BluetoothLeScanner. Bu yöntemin gerektirdiği bildirimdeki kurs ve hassas konum izinleri konusunda sorun yaşamadım. Sadece uygulamamın kullanıcılarının uygulamamı kullanmak için cihazlarında (GPS, vb.) Konum hizmetlerini etkinleştirmelerini istemiyorum.

Önceden, startScan()yöntem telefonda Konum hizmetleri devre dışı bırakılmış olarak çalışır ve sonuçları döndürürdü. Bununla birlikte, Marshmallow'da, aynı uygulama "tarar", ancak sessizce başarısız olur ve telefonda konum hizmetleri etkinleştirilmediğinde ve kurs / hassas konum izinleri bildirideyken hiçbir sonuç döndürmez.


Hangi cihazları kullanıyorsunuz? Moto G 2. Nesil ile aynı problemle karşılaştım. Moto G 1. Nesil ve Nexus 6, konum hizmetlerini açıkça etkinleştirmeden tam olarak aynı kodla sorunsuz çalışır.
shadowhorst

Marshmallow çalıştıran herhangi bir cihazda fark ettim - Nexus 5X, Samsung S6, Samsung S7, LG G4
V-PTR

Yanıtlar:


91

Hayır, bu bir hata değil.

Bu sorun , bunun amaçlanan davranış olduğunu ve düzeltmeyeceklerini söyleyerek yanıt verdikleri Google'a iletildi. Geliştiricileri, donanım tanımlayıcı erişimi için artık konum izninin gerekli olduğuna işaret ettiği bu siteye yönlendirdiler . Kullanıcılarını gereksinimden haberdar etmek artık geliştiricinin sorumluluğundadır.

Bununla birlikte, sorunda, Konum hizmetlerinin (GPS vb.) Neden gerekli olduğunu ele almıyor ve amaçlanan davranış olarak işaretlendiğinden, sorunu açıklamak için sorunu yeniden ziyaret edecek gibi görünmüyor.

Sorunun ikinci bölümünü cevaplamak için: Evet, Konum servislerini etkinleştirmeden taramak mümkündür. Kullanarak bir Bluetooth klasik taraması yapabilirsiniz BluetoothAdapter.getDefaultAdapter().startDiscovery()ve bu, Konum hizmetleri kapalıyken çalışacaktır. Bu, tüm Bluetooth cihazlarını, BLE ve diğerlerini keşfedecektir. Ancak, BLE cihazlarının bir sonucu olarak görülmeleri durumunda sahip olacakları bir tarama kaydı olmayacaktır startScan().


12
Google'ın bir hata olmadığını iddia etmesi beni soğuk bırakıyor. Tutumları düpedüz BS.
Marki

22
Bu gerçekten bir hata değil - kötü niyetli bir uygulama geliştiricisi bilinen bluetooth işaretlerini tarayabilirse, konum izinleri isteyerek kullanıcının şüphelerini artırmadan konumunuzu bulabilir. Bu nedenle, BLE erişimini istemek, maalesef zor konumunuzu sormakla aynı şekilde ele alınmalıdır.
ArtHare

9
Bakalım doğru anlamış mıyım. BLE'nin en büyük avantajı "LE" bitidir, yani Düşük Enerji, yani pilimin daha az tükenmesi anlamına gelir. Tabii ki, bu tasarrufları elde etmek için, bilinen bir batarya olan GPS'i açmalıyım, böylece BLE kullanımından elde etmiş olabileceğim herhangi bir güç tasarrufunu ortadan kaldırmalıyım. / bana inanamayarak kafamı sallıyor.
dgnuff

11
Bu inanılmaz. Elbette Google, BLE taramalarının konum belirlemek için kullanılmasından endişe duyuyorsa, kullanıcıyı GPS erişimine izin vermeye zorlayarak bebeği banyo suyuyla atmak yerine bunun için ayrı bir izin eklemesi gerekirdi!
2019'da

4
@ Pierre-LucPaour GPS'i açmaya zorlamak, konum servislerini gerçekten kullanan diğer uygulamaların onu sahne arkasında 'yasal olarak' kullanabileceği anlamına gelir. Kullanıcıların GPS'i manuel olarak kapatmasının nedenlerinden biri, uygulamaların periyodik olarak GPS'i kullanmasını ve pilini tüketmesini önlemektir; GPS'i Bluetooth'u aramaya zorlamak, kullanıcının konumlarının kullanılabileceğini bilmesini sağlamanın en karşı sezgisel yoludur.
Ankit

11

Ben ayarlayarak bu çözüldü targetSdkVersioniçin 22 Gradle dosyasında. ACCESS_COARSE_LOCATIONManifestte beyan etmelisiniz , ancak kullanıcı Uygulama Ayarlarından bu izni reddetse bile BLE taraması çalışacaktır.

Bu, konum izni istemekten kaçınmak için yapılan bir saldırıdır. En son android sürümlerini hedeflemek daha iyidir.

Düzenle

Google Play yeni uygulamaların en az Android 8.0'ı (API seviyesi 26) hedeflemesini gerektireceğinden, bu çözüm artık kullanılmamalıdır. Uygulamalar, BLE taraması için konum izni istemelidir.


Çok teşekkürler! Örneğin AltBeacon gibi izlemeyi simüle eden kitaplıklarla ne yapacağınız konusunda bir fikriniz var mı? Konum olmadan çalışmıyorlar :( ve temelde aynı mekanizmayı kullanıyorlar ... Peki ya min derleme sürümü? @JiTHiN
Shahar Lahav

23'ten 22'ye düşürüldü ve Android 7.0'da bile çalışıyor. İlk sorunum yerelleştirmeyi etkinleştirmeniz gerektiğiydi, şimdi yerelleştirme devre dışı bırakılmış BLE cihazlarını tarayabilirim.
Mariusz Wiazowski

1
Bu bir hack'tir, ancak bu TAVSİYE EDİLMEZ , en son sdk sürümlerini hedeflemek her zaman daha iyidir. Bunu yapmanın doğru yolu ACCESS_COARSE_LOCATIONçalışma zamanında talep etmektir
Aaron

2
Bu artık bir çözüm değil (bkz. Developer.android.com/distribute/best-practices/develop/… "Google Play, 1 Ağustos 2018'den itibaren yeni uygulamaların en az Android 8.0'ı (API seviyesi 26) hedeflemesini gerektirecek ve uygulama güncellemeleri 1 Kasım 2018'den itibaren Android 8.0'ı hedefliyor. ")
Étienne

10

Bulduğum şey, Android 6'dan sonra ACCESS_COARSE_LOCATION izni vermeniz gerektiğidir. Ancak bazı cihazlarda, çevresel cihazları keşfedebilmeniz için telefon konum servisinizin (GPS) de açılması gerekir. Bunu Android 7.0 ile Nexus 5x kullanırken buldum.


1
Nexus 5x ve Android 6 için de aynısı
korumalımember

Android 7.1.1 ile Moto G5
plus'ta da

3

Bunu manifestoda da denedim ama izin istemedim, nedenini bilmiyorum. Uygulama başlangıçta Konum izni mi istiyor? Değilse , çalışma zamanında izin istememiz gerekir .

Ayrıca, uygulamanızın düzgün çalışıp çalışmadığını test etmek için bunu kontrol edebilirsiniz:

Ayarlar> Uygulamalar> Uygulamanız> İzinler'i açın ve Konum'u etkinleştirin ve ardından sonuçları taramayı deneyin.

Konum, yalnızca manifest üzerinde ACCESS_COARSE_LOCATION sağladıysanız burada listelenecektir.


1
Evet, çalışma zamanında açıkça izin istemeniz ve cihaz için konum hizmetlerini açmanız gerekir. Ancak, çalışma zamanında konum hizmetlerini açmak veya kurs konumu izni talep etmek zorunda kalmadan BLE taraması yapmanın bir yolu olup olmadığını merak ediyordum.
V-PTR

İzin istemek yeterli değildir, konum hizmetlerinin de etkin olup olmadığını kontrol etmeniz gerekir.
drindt

3

Kullanabilirsiniz BluetoothAdapter.startDiscovery().
Hem Bluetooth Smart hem de klasik Bluetooth cihazları tarayacaktır, ancak konum hizmetlerinin etkinleştirilmesine gerek yoktur.
( ACCESS_COARSE_LOCATIONAndroid 6'da hâlâ izinlere ihtiyacınız var .)

BluetoothDevice.getTypeBluetooth Smart / Düşük Enerji cihazlarını filtrelemek için bulunan cihazları arayabilirsiniz .


0

Eclipse'de yazılan koduma baktım ve orada startScan (API 21) işlevini manifest dosyasında konum bilgileri bildirmeden kullanıyorum. Yine de uygun geri aramayı alıyorum. Kodu konum bildirimi olmadan çalıştırmayı denediniz mi? Öte yandan, bu izinleri gerektirmeyen kullanımdan kaldırılmış startLeScan'i (API 18) kullanabilirsiniz. Ancak bence hizmette istenen özelliği aramak ve okumak API 18 yöntemleriyle daha karmaşıktır.


startScanİşlevini içinde kullanıyorum BluetoothLeScanner. Kullanımdan kaldırılmamış yöntemleri bilerek kullanıyorum. Aslında, sağlanan yeni yöntemleri özel olarak kullanmak için 21'den büyük API kullanan cihazları kontrol ediyorum. Konum olmadan denedim ve sessizce başarısız oldu. Tarama çalışıyor ancak hiçbir şey döndürülmüyor (API 21 sonrası yöntemi kullanılarak)
V-PTR

0

Son zamanlarda android 8.0'da fark ettiğimden, bir BLE Taraması yapmak için GPS'inizi açmanız gerekmiyor, ancak bunu manifestte bildirmeniz gerekiyor, ancak kullanıcının izin vermesi gerekiyor.

Android, startScan()yöntemle tarama yapmaya çalıştığınızda kullanıcıdan konum iznine izin vermesini isteyecektir . İzne izin verilmezse taramanız başarısız olacaktır.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.