ต้องเปิดใช้งานตำแหน่งสำหรับการสแกนด้วยบลูทู ธ พลังงานต่ำบน Android 6.0


105

หลังจากอัปเกรดเป็น Android เวอร์ชัน 6.0 การสแกน Bluetooth Low Energy (BLE) จะใช้ได้เฉพาะเมื่อเปิดใช้งานบริการตำแหน่งบนอุปกรณ์เท่านั้น ดูที่นี่สำหรับการอ้างอิง: Bluetooth Low Energy startScan บน Android 6.0 ไม่พบอุปกรณ์

โดยทั่วไปคุณจะต้องเปิดใช้งานการอนุญาตสำหรับแอปและเปิดใช้งานสำหรับโทรศัพท์ นี่คือบั๊กหรือไม่? เป็นไปได้ไหมที่จะสแกนโดยไม่เปิดใช้บริการระบุตำแหน่ง ฉันไม่ต้องการมีตำแหน่งสำหรับแอปทั้งหมดของฉัน

แก้ไข ฉันไม่ได้พูดถึงว่าฉันกำลังใช้startScan()วิธีการที่BluetoothLeScannerให้ไว้ใน API 21 ฉันโอเคกับหลักสูตรและการอนุญาตตำแหน่งที่ดีในรายการที่วิธีนี้ต้องการ ฉันไม่ต้องการให้ผู้ใช้แอปของฉันต้องเปิดใช้บริการระบุตำแหน่งบนอุปกรณ์ (GPS ฯลฯ ) เพื่อใช้แอปของฉัน

ก่อนหน้านี้startScan()วิธีนี้จะเรียกใช้และส่งคืนผลลัพธ์โดยปิดใช้บริการตำแหน่งบนโทรศัพท์ อย่างไรก็ตามใน Marshmallow แอปพลิเคชันเดียวกันจะ "สแกน" แต่ล้มเหลวโดยไม่โต้ตอบและไม่แสดงผลลัพธ์เมื่อไม่ได้เปิดใช้งานบริการระบุตำแหน่งบนโทรศัพท์และการอนุญาตแน่นอน / ตำแหน่งที่ดียังคงอยู่ในไฟล์ Manifest


คุณใช้อุปกรณ์อะไร ฉันพบปัญหาเดียวกันกับ Moto G รุ่นที่ 2 Moto G รุ่นที่ 1 และ Nexus 6 ทำงานได้ดีโดยใช้รหัสเดียวกันทุกประการโดยไม่ต้องเปิดใช้บริการระบุตำแหน่งอย่างชัดเจน
shadowhorst

ฉันสังเกตเห็นมันบนอุปกรณ์ใด ๆ ที่ใช้ Marshmallow - Nexus 5X, Samsung S6, Samsung S7, LG G4
V-PTR

คำตอบ:


89

ไม่นี่ไม่ใช่ข้อผิดพลาด

นี้ปัญหาถูกนำขึ้นไปยัง Google ที่พวกเขาตอบสนองบอกว่านี้เป็นพฤติกรรมที่ตั้งใจและพวกเขาจะไม่สามารถแก้ไขได้ พวกเขานำนักพัฒนาไปที่ไซต์นี้ซึ่งชี้ให้เห็นว่าตอนนี้จำเป็นต้องมีการอนุญาตตำแหน่งสำหรับการเข้าถึงตัวระบุฮาร์ดแวร์ ขณะนี้เป็นความรับผิดชอบของนักพัฒนาในการแจ้งให้ผู้ใช้ทราบถึงข้อกำหนด

อย่างไรก็ตามในปัญหานี้ไม่ได้ระบุว่าเหตุใดจึงต้องใช้บริการระบุตำแหน่ง (GPS ฯลฯ ) และดูเหมือนว่าพวกเขาจะไม่กลับมาทบทวนปัญหาเพื่ออธิบายสิ่งนี้เนื่องจากถูกทำเครื่องหมายว่าเป็นพฤติกรรมที่ตั้งใจไว้

ในการตอบคำถามส่วนที่สอง: ใช่คุณสามารถสแกนได้โดยไม่ต้องเปิดใช้งานบริการตำแหน่ง คุณสามารถสแกนแบบคลาสสิกบลูทู ธ โดยใช้BluetoothAdapter.getDefaultAdapter().startDiscovery()และจะใช้งานได้กับบริการตำแหน่ง สิ่งนี้จะค้นพบอุปกรณ์บลูทู ธ BLE และอื่น ๆ ทั้งหมด แต่อุปกรณ์ BLE startScan()จะไม่ได้มีการบันทึกการสแกนที่พวกเขาจะได้มีถ้าพวกเขาถูกมองว่าเป็นผลมาจากการ


12
Google อ้างว่าไม่ใช่ข้อผิดพลาดทำให้ฉันหนาว ทัศนคติของพวกเขาเป็น BS ธรรมดา
กี้

21
ไม่ใช่ข้อผิดพลาดจริงๆ - หากนักพัฒนาแอปที่เป็นอันตรายสามารถสแกนหาบลูทู ธ บีคอนที่เป็นที่รู้จักพวกเขาจะสามารถหาตำแหน่งของคุณได้โดยไม่ทำให้ผู้ใช้สงสัยด้วยการขอสิทธิ์เข้าถึงตำแหน่ง ดังนั้นการขอการเข้าถึง BLE จะต้องได้รับการปฏิบัติเช่นเดียวกับการขอตำแหน่งคร่าวๆของคุณ
ArtHare

9
ขอดูว่าตรงไหม ข้อได้เปรียบที่ดีของ BLE คือบิต "LE" นั่นคือพลังงานต่ำซึ่งหมายถึงการระบายแบตเตอรี่ที่ลดลง แน่นอนว่าเพื่อให้ได้มาซึ่งการประหยัดนั้นฉันต้องเปิด GPS ซึ่งเป็นแบตเตอรี่ที่รู้จักกันดีดังนั้นจึงเป็นการปฏิเสธการประหยัดพลังงานใด ๆ ที่ฉันอาจได้รับจากการใช้ BLE / ฉันสั่นหัวด้วยความไม่เชื่อ
dgnuff

10
นี่เป็นเรื่องเหลือเชื่อ แน่นอนว่าหาก Google กังวลเกี่ยวกับการใช้การสแกน BLE เพื่อสรุปตำแหน่งพวกเขาควรจะเพิ่มการอนุญาตแยกต่างหากสำหรับสิ่งนั้นแทนที่จะโยนทารกออกไปกับอ่างน้ำโดยบังคับให้ผู้ใช้อนุญาตให้เข้าถึง GPS!
Desty

4
@ Pierre-LucPaour การบังคับให้เปิด GPS หมายถึงแอปอื่น ๆ ที่ใช้บริการระบุตำแหน่งจริงสามารถใช้งานได้อย่างถูกต้องตามกฎหมาย เหตุผลหนึ่งที่ผู้ใช้ปิด GPS ด้วยตนเองคือการป้องกันไม่ให้แอปใช้งานเป็นระยะและทำให้แบตเตอรี่หมดการบังคับให้ GPS ค้นหาบลูทู ธ เป็นวิธีที่ง่ายที่สุดในการแจ้งให้ผู้ใช้ทราบว่าอาจมีการใช้ตำแหน่งของตน
Ankit

11

ฉันแก้ไขสิ่งนี้โดยตั้งค่าtargetSdkVersionเป็น22ในไฟล์ Gradle คุณต้องประกาศACCESS_COARSE_LOCATIONในรายการ แต่การสแกน BLE จะทำงานแม้ว่าผู้ใช้จะปฏิเสธการอนุญาตนี้จากการตั้งค่าแอพ

นี่เป็นเพียงการแฮ็กเพื่อหลีกเลี่ยงการขออนุญาตตำแหน่ง ควรกำหนดเป้าหมายเป็น Android เวอร์ชันล่าสุดจะดีกว่า

แก้ไข

ไม่ควรใช้โซลูชันนี้อีกต่อไปเนื่องจาก Google Play ต้องการให้แอปใหม่กำหนดเป้าหมายอย่างน้อย Android 8.0 (API ระดับ 26) แอปควรขออนุญาตตำแหน่งสำหรับการสแกน BLE


เยี่ยมมากขอบคุณ! คุณมีความคิดว่าจะทำอย่างไรกับไลบรารีที่จำลองการตรวจสอบเช่น AltBeacon เป็นต้น ไม่ทำงานโดยไม่มีตำแหน่งบน :( และพวกเขาใช้กลไกเดียวกันโดยทั่วไป ... แล้วเวอร์ชันคอมไพล์ขั้นต่ำล่ะ @JiTHiN
Shahar Lahav

ลดระดับจาก 23 เป็น 22 และใช้งานได้แม้ใน Android 7.0 ปัญหาเริ่มต้นของฉันคือคุณต้องเปิดใช้งานการแปลเป็นภาษาท้องถิ่นตอนนี้ฉันสามารถสแกนอุปกรณ์ BLE โดยปิดใช้งานการแปล
Mariusz Wiazowski

1
นี่เป็นการแฮ็ก แต่ไม่แนะนำให้กำหนดเป้าหมายเวอร์ชัน sdk ล่าสุดจะดีกว่าเสมอ วิธีที่เหมาะสมในการดำเนินการนี้คือการร้องขอACCESS_COARSE_LOCATIONในรันไทม์
Aaron

2
นี่ไม่ใช่วิธีแก้ปัญหาอีกต่อไป (ดูdeveloper.android.com/distribute/best-practices/develop/… "Google Play จะกำหนดให้แอปใหม่กำหนดเป้าหมายเป็น Android 8.0 (API ระดับ 26) เป็นอย่างน้อยตั้งแต่วันที่ 1 สิงหาคม 2018 เป็นต้นไป การอัปเดตแอปกำหนดเป้าหมายเป็น Android 8.0 ตั้งแต่วันที่ 1 พฤศจิกายน 2018 ")
Étienne

10

สิ่งที่ฉันพบคือหลังจาก Android 6 คุณต้องให้สิทธิ์ ACCESS_COARSE_LOCATION แต่ในอุปกรณ์บางอย่างก็จำเป็นต้องเปิดบริการตำแหน่งโทรศัพท์ (GPS) ของคุณด้วยเพื่อให้คุณสามารถค้นหาอุปกรณ์ต่อพ่วงได้ ฉันพบว่าเมื่อใช้ Nexus 5x กับ Android 7.0


1
เหมือนกันสำหรับฉันกับ Nexus 5x และ Android 6
ได้รับการป้องกัน

เช่นเดียวกันกับ Moto G5 plus พร้อม Android 7.1.1
RootCode

3

ฉันได้ลองสิ่งนี้กับรายการ แต่ไม่ได้ขออนุญาตไม่แน่ใจว่าทำไม คุณกำลังแจ้งให้แอปขออนุญาตตำแหน่งเมื่อเริ่มต้นหรือไม่ หากยังไม่ได้เราต้องขออนุญาตในการรันไทม์

คุณสามารถตรวจสอบสิ่งนี้เพื่อทดสอบว่าแอปของคุณทำงานได้ดีหรือไม่:

เปิดการตั้งค่า> แอป> แอปพลิเคชันของคุณ> สิทธิ์และเปิดใช้งานตำแหน่งจากนั้นลองสแกนเพื่อหาผลลัพธ์

ตำแหน่งจะแสดงที่นี่เฉพาะในกรณีที่คุณได้ระบุ ACCESS_COARSE_LOCATION ในรายการ


1
ใช่คุณต้องขออนุญาตอย่างชัดเจนในขณะรันไทม์และเปิดบริการตำแหน่งสำหรับอุปกรณ์ แต่ฉันสงสัยว่ามีวิธีในการสแกน BLE โดยไม่ต้องเปิดบริการระบุตำแหน่งหรือขออนุญาตตำแหน่งของหลักสูตรขณะรันไทม์
V-PTR

การขอสิทธิ์ไม่เพียงพอคุณต้องตรวจสอบว่ามีการเปิดใช้บริการตำแหน่งด้วยหรือไม่
drindt

3

คุณสามารถใช้BluetoothAdapter.startDiscovery().
จะสแกนหาทั้งอุปกรณ์ Bluetooth Smart และ Bluetooth แบบคลาสสิก แต่ไม่จำเป็นต้องเปิดใช้งานบริการตำแหน่ง
(คุณยังต้องการACCESS_COARSE_LOCATIONสิทธิ์บน Android 6)

คุณสามารถเรียกBluetoothDevice.getTypeอุปกรณ์ที่พบเพื่อกรองอุปกรณ์ Bluetooth Smart / Low Energy


0

ฉันได้ดูโค้ดของฉันที่เขียนใน Eclipse แล้วและฉันใช้ฟังก์ชัน startScan (API 21) ที่นั่นโดยไม่ต้องประกาศตำแหน่งที่ตั้งในไฟล์รายการ ฉันยังคงได้รับการติดต่อกลับที่ถูกต้อง คุณได้ลองรันโค้ดโดยไม่มีการประกาศตำแหน่งหรือไม่? ในทางกลับกันคุณสามารถใช้ startLeScan (API 18) ที่เลิกใช้แล้วซึ่งไม่ต้องการการอนุญาตเหล่านี้ อย่างไรก็ตามในความคิดของฉันการค้นหาและการอ่านลักษณะที่ต้องการในบริการนั้นซับซ้อนกว่าด้วยวิธี API 18


ฉันกำลังใช้startScanฟังก์ชันในBluetoothLeScanner. ฉันตั้งใจใช้วิธีการที่ไม่เลิกใช้งาน อันที่จริงฉันกำลังตรวจสอบอุปกรณ์ที่ใช้ API มากกว่า 21 เพื่อใช้วิธีการใหม่ที่ให้มาโดยเฉพาะ ฉันพยายามโดยไม่ระบุตำแหน่งและมันก็ล้มเหลวอย่างเงียบ ๆ การสแกนทำงาน แต่ไม่มีสิ่งใดส่งคืน (โดยใช้เมธอด post- API 21)
V-PTR

0

จากสิ่งที่ฉันเพิ่งสังเกตเห็นใน Android 8.0 ไม่จำเป็นต้องเปิด GPS ของคุณเพื่อทำการสแกน BLE แต่คุณต้องประกาศในรายการ แต่ผู้ใช้ต้องอนุญาต

Android จะแจ้งให้ผู้ใช้อนุญาตการอนุญาตตำแหน่งเมื่อคุณพยายามทำการสแกนด้วยstartScan()วิธีการ การสแกนของคุณจะล้มเหลวหากไม่ได้รับอนุญาต


0

คุณสามารถสแกนอุปกรณ์ BLE โดยไม่ต้องเข้าถึงตำแหน่งโดยใช้ CompanionDeviceManager (API26) https://developer.android.com/reference/android/companion/CompanionDeviceManager

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.