Vị trí cần được bật để Quét năng lượng thấp qua Bluetooth trên Android 6.0


99

Sau khi nâng cấp lên phiên bản Android 6.0, tính năng quét Bluetooth Low Energy (BLE) sẽ chỉ hoạt động nếu Dịch vụ vị trí được bật trên thiết bị. Xem tại đây để tham khảo: Bluetooth Low Energy startScan trên Android 6.0 không tìm thấy thiết bị

Về cơ bản, bạn cần phải bật quyền cho ứng dụng cũng như cho điện thoại. Đây có phải là một lỗi? Có thể quét mà không thực sự bật dịch vụ định vị không? Tôi không muốn phải có vị trí cho tất cả các ứng dụng của mình.

CHỈNH SỬA Tôi không đề cập được rằng tôi đang sử dụng startScan()phương pháp BluetoothLeScannerđược cung cấp trong API 21. Tôi đồng ý với khóa học và các quyền vị trí tốt trong tệp kê khai mà phương pháp này yêu cầu. Tôi chỉ không muốn người dùng ứng dụng của mình phải bật dịch vụ định vị trên thiết bị của họ (GPS, v.v.) để sử dụng ứng dụng của tôi.

Trước đây, startScan()phương pháp này sẽ chạy và trả về kết quả khi dịch vụ Vị trí bị tắt trên điện thoại. Tuy nhiên, trên Marshmallow, ứng dụng tương tự sẽ "quét" nhưng không thành công một cách âm thầm và không trả về kết quả khi dịch vụ định vị không được bật trên điện thoại và các quyền về khóa học / vị trí tốt vẫn còn trong tệp kê khai.


Bạn đang sử dụng thiết bị nào? Tôi đã gặp phải vấn đề tương tự với Moto G thế hệ thứ 2. Moto G Thế hệ 1 và Nexus 6 chạy tốt với cùng một mã mà không cần bật dịch vụ định vị một cách rõ ràng.
shadowhorst

Tôi đã nhận thấy nó trên bất kỳ thiết bị nào chạy Marshmallow - Nexus 5X, Samsung S6, Samsung S7, LG G4
V-PTR

Câu trả lời:


85

Không, đây không phải là lỗi.

Đây vấn đề đã được đưa lên Google nơi họ trả lời rằng đây là hành vi có ý định và họ sẽ không sửa chữa nó. Họ đã hướng các nhà phát triển đến trang web này , nơi nó chỉ ra rằng quyền vị trí bây giờ là cần thiết để truy cập số nhận dạng phần cứng. Giờ đây, nhà phát triển có trách nhiệm làm cho người dùng của họ nhận thức được yêu cầu.

Tuy nhiên, trong vấn đề này, nó không giải quyết lý do tại sao cần phải có Dịch vụ vị trí (GPS, v.v.) và có vẻ như họ sẽ không xem lại vấn đề để giải thích điều này vì nó đã được đánh dấu là hành vi dự kiến.

Để trả lời phần thứ hai của câu hỏi: Có, có thể quét mà không cần bật Dịch vụ vị trí. Bạn có thể thực hiện quét Bluetooth cổ điển bằng cách sử dụng BluetoothAdapter.getDefaultAdapter().startDiscovery()và thao tác này sẽ hoạt động khi dịch vụ Vị trí tắt. Điều này sẽ khám phá tất cả các thiết bị Bluetooth, BLE và các thiết bị khác. Tuy nhiên, thiết bị BLE sẽ không có bản ghi quét mà chúng sẽ có nếu chúng được nhìn thấy như vậy startScan().


11
Google khẳng định đó không phải là một lỗi khiến tôi cảm thấy lạnh. Thái độ của họ là thẳng thắn BS.
Marki,

21
Đó thực sự không phải là một lỗi - nếu một nhà phát triển ứng dụng độc hại có thể quét các báo hiệu bluetooth đã biết, thì họ có thể tìm ra vị trí của bạn mà không làm người dùng nghi ngờ bằng cách yêu cầu quyền vị trí. Vì vậy, yêu cầu quyền truy cập BLE rất tiếc phải được xử lý giống như yêu cầu vị trí thô của bạn.
ArtHare

3
@orionelenzil "Quyền khác mà bạn phải khai báo là ACCESS_COARSE_LOCATION hoặc ACCESS_FINE_LOCATION. Cần có quyền vị trí vì có thể sử dụng tính năng quét Bluetooth để thu thập thông tin về vị trí của người dùng." từ developer.android.com/guide/topics/connectivity/bl
Bluetooth

7
Hãy để tôi xem nếu tôi có điều này thẳng thắn. Lợi thế lớn của BLE là bit "LE", tức là Năng lượng thấp, có nghĩa là giảm tiêu hao pin của tôi. Tất nhiên, để đạt được những khoản tiết kiệm đó, tôi phải bật GPS, một loại pin đã biết, do đó sẽ phủ nhận mọi khoản tiết kiệm điện mà tôi có thể đã nhận được khi sử dụng BLE. / tôi lắc đầu không tin.
dgnuff

8
Điều này thật phi thường. Chắc chắn nếu Google lo ngại về việc quét BLE được sử dụng để suy ra vị trí, họ nên thêm một quyền riêng cho điều đó, thay vì ném đứa bé ra ngoài bằng nước tắm bằng cách buộc người dùng cho phép truy cập GPS!
Desty

11

Tôi đã giải quyết vấn đề này bằng cách đặt targetSdkVersionthành 22 trong tệp Gradle. Bạn phải khai báo ACCESS_COARSE_LOCATIONtrong tệp kê khai nhưng quét BLE sẽ hoạt động ngay cả khi người dùng từ chối quyền này từ Cài đặt ứng dụng.

Đây chỉ là một cuộc tấn công để tránh yêu cầu quyền vị trí. Tốt hơn nên nhắm mục tiêu các phiên bản Android mới nhất.

Biên tập

Giải pháp này sẽ không được sử dụng nữa vì Google Play sẽ yêu cầu các ứng dụng mới phải nhắm mục tiêu tối thiểu Android 8.0 (API cấp 26). Các ứng dụng phải yêu cầu quyền vị trí để quét BLE.


Cảm ơn rất nhiều! Bạn có ý tưởng làm gì với các thư viện mô phỏng giám sát như AltBeacon chẳng hạn? Các không làm việc mà không vị trí trên :( và họ đang sử dụng về cơ bản cơ chế tương tự ... Và những gì về phiên bản biên dịch phút @JiTHiN?
Shahar Lahav

Đã hạ cấp từ 23 xuống 22 và nó hoạt động ngay cả trên Android 7.0. Vấn đề ban đầu của tôi là bạn phải bật bản địa hóa, bây giờ tôi có thể quét các thiết bị BLE bị tắt bản địa hóa.
Mariusz Wiazowski

1
Đây là một bản hack, tuy nhiên điều này KHÔNG ĐƯỢC KHUYẾN CÁO, nó luôn tốt hơn để nhắm mục tiêu các phiên bản sdk mới nhất. Cách thích hợp để làm điều này là để yêu cầu ACCESS_COARSE_LOCATIONtrong thời gian chạy
Aaron

2
Đây không phải là một giải pháp nữa (xem developer.android.com/distribute/best-practices/develop/… "Google Play sẽ yêu cầu các ứng dụng mới phải nhắm mục tiêu tối thiểu Android 8.0 (API cấp 26) từ ngày 1 tháng 8 năm 2018 và điều đó cập nhật ứng dụng nhắm mục tiêu đến Android 8.0 từ ngày 1 tháng 11 năm 2018. ")
Étienne

10

Điều tôi nhận thấy là sau Android 6, bạn phải cấp quyền ACCESS_COARSE_LOCATION. Nhưng trên một số thiết bị cũng cần bật dịch vụ định vị điện thoại (GPS) của bạn để bạn có thể khám phá các thiết bị ngoại vi. Tôi thấy rằng sử dụng Nexus 5x, với Android 7.0.


1
Tôi cũng vậy với Nexus 5x và Android 6
được bảo vệ

Tương tự trên Moto G5 plus với Android 7.1.1
RootCode

3

Tôi cũng đã thử điều này trên tệp kê khai nhưng không yêu cầu sự cho phép, không rõ tại sao. Ứng dụng của bạn có đang nhắc cho phép Vị trí khi khởi động không? Nếu không, chúng tôi cần yêu cầu quyền trong thời gian chạy .

Ngoài ra, bạn có thể kiểm tra điều này để kiểm tra xem ứng dụng của bạn có hoạt động tốt hay không:

Mở Cài đặt> Ứng dụng> Ứng dụng của bạn> Quyền và bật Vị trí rồi thử quét để tìm kết quả.

Vị trí sẽ chỉ được liệt kê ở đây nếu bạn đã cung cấp ACCESS_COARSE_LOCATION trên tệp kê khai.


1
Vâng, bạn phải yêu cầu rõ ràng quyền trong thời gian chạy cũng như bật dịch vụ định vị cho thiết bị. Nhưng tôi tự hỏi liệu có cách nào để thực hiện quét BLE mà không cần phải bật dịch vụ định vị hoặc yêu cầu quyền vị trí của khóa học trong thời gian chạy hay không.
V-PTR

Yêu cầu quyền là chưa đủ, bạn cần kiểm tra xem dịch vụ vị trí có được bật hay không.
drindt

2

Bạn có thể sử dụng BluetoothAdapter.startDiscovery().
Nó sẽ quét cả Bluetooth Smart và các thiết bị Bluetooth cổ điển, nhưng không cần bật dịch vụ định vị.
(Bạn vẫn cần ACCESS_COARSE_LOCATIONquyền trên Android 6.)

Bạn có thể gọi BluetoothDevice.getTypetrên các thiết bị được tìm thấy để lọc các thiết bị Bluetooth Thông minh / Năng lượng thấp.


0

Vâng, tôi đã xem mã của mình được viết trong Eclipse và tôi sử dụng ở đó hàm startScan (API 21) mà không cần khai báo nội dung vị trí trong tệp kê khai. Tôi vẫn nhận được cuộc gọi lại thích hợp. Bạn đã thử chạy mã mà không cần khai báo vị trí chưa? Mặt khác - bạn có thể sử dụng startLeScan (API 18) không dùng nữa không yêu cầu các quyền này. Tuy nhiên, theo ý kiến ​​của tôi, việc tìm kiếm và đọc đặc tính mong muốn trong dịch vụ phức tạp hơn với các phương thức API 18.


Tôi đang sử dụng startScanchức năng trong BluetoothLeScanner. Tôi đang sử dụng có mục đích các phương pháp không bị phản đối. Trên thực tế, tôi đang kiểm tra các thiết bị đang sử dụng API lớn hơn 21 để sử dụng cụ thể các phương pháp mới được cung cấp. Tôi đã thử mà không có vị trí và nó chỉ âm thầm thất bại. Quá trình quét chạy nhưng không có gì được trả lại (sử dụng phương pháp post- API 21)
V-PTR

0

Từ những gì tôi nhận thấy gần đây trên Android 8.0, không bắt buộc phải bật GPS của bạn để thực hiện Quét BLE, nhưng bạn phải khai báo nó trong tệp kê khai, nhưng người dùng phải cho phép.

Android sẽ nhắc người dùng cho phép vị trí khi bạn cố gắng quét bằng startScan()phương pháp. Quá trình quét của bạn sẽ không thành công nếu không được phép.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.