Android 6.0 पर ब्लूटूथ लो एनर्जी स्कैनिंग के लिए स्थान को सक्षम करने की आवश्यकता है


95

एंड्रॉइड वर्जन में अपग्रेड करने के बाद 6.0 ब्लूटूथ लो एनर्जी (BLE) स्कैनिंग केवल तभी काम करेगी जब डिवाइस पर लोकेशन सर्विसेज इनेबल हो जाए। संदर्भ के लिए यहां देखें: Android 6.0 पर ब्लूटूथ कम ऊर्जा startScan उपकरणों को नहीं ढूंढता है

असल में, आपको ऐप के साथ-साथ फोन के लिए भी अनुमति सक्षम होना चाहिए। क्या यह बग है? क्या वास्तव में सक्षम किए बिना स्थान सेवाओं को स्कैन करना संभव है? मैं अपने सभी ऐप्स के लिए स्थान नहीं रखना चाहता।

संपादित करें मैं यह उल्लेख करने में विफल रहा कि मैं एपीआई 21 startScan()में BluetoothLeScannerप्रदान की गई विधि का उपयोग कर रहा हूं। मैं इस पद्धति की आवश्यकता के अनुरूप पाठ्यक्रम और ठीक स्थान अनुमतियों के साथ ठीक हूं। मैं नहीं चाहता कि मेरे ऐप के उपयोगकर्ताओं को अपने ऐप का उपयोग करने के लिए अपने डिवाइस (GPS, आदि) पर स्थान सेवाओं को सक्षम करना पड़े।

पहले, यह startScan()विधि फ़ोन पर अक्षम की गई सेवाओं के साथ परिणाम चलाएगी और वापस लौटेगी। मार्शमैलो पर, हालांकि, एक ही एप्लिकेशन "स्कैन" करेगा, लेकिन चुपचाप विफल हो गया और फोन पर स्थान सेवाएं सक्षम नहीं होने पर कोई परिणाम नहीं मिला और पाठ्यक्रम / ठीक स्थान अनुमतियाँ अभी भी प्रकट में थीं।


आप किन उपकरणों का उपयोग कर रहे हैं? मैं एक मोटो जी 2nd जनरेशन के साथ एक ही समस्या में भाग गया। Moto G 1st Generation और Nexus 6 ठीक उसी कोड के साथ ठीक से चलते हैं, जो बिना किसी स्थान की जानकारी के स्पष्ट रूप से सक्षम है।
शैडोर्स्ट

मैंने इसे मार्शमैलो - नेक्सस 5 एक्स, सैमसंग एस 6, सैमसंग एस 7, एलजी जी 4
वी-पीटीआर

जवाबों:


83

नहीं, यह बग नहीं है।

इस मुद्दे को Google के सामने लाया गया जहां उन्होंने जवाब दिया कि यह इच्छित व्यवहार था और वे इसे ठीक नहीं करेंगे। उन्होंने डेवलपर्स को इस साइट पर निर्देशित किया, जहां यह बताता है कि हार्डवेयर पहचानकर्ता पहुंच के लिए अब स्थान की अनुमति की आवश्यकता है। यह अब डेवलपर की जिम्मेदारी है कि वह अपने उपयोगकर्ताओं को आवश्यकता के बारे में जागरूक करे।

समस्या में, हालांकि, यह पता नहीं करता है कि स्थान सेवाओं (जीपीएस, आदि) की आवश्यकता क्यों है और ऐसा नहीं लगता है कि वे इस मुद्दे को समझाने के लिए जा रहे हैं क्योंकि इसे इच्छित व्यवहार के रूप में चिह्नित किया गया है।

प्रश्न के दूसरे भाग का उत्तर देने के लिए: हाँ, स्थान सेवाओं को सक्षम किए बिना स्कैन करना संभव है। आप एक ब्लूटूथ क्लासिक स्कैन का उपयोग कर सकते हैं BluetoothAdapter.getDefaultAdapter().startDiscovery()और वह स्थान सेवाओं के साथ काम करेगा। यह सभी ब्लूटूथ डिवाइस, BLE और अन्यथा की खोज करेगा। हालाँकि, BLE उपकरणों का स्कैन रिकॉर्ड नहीं होगा, जो कि यदि उन्हें इसके परिणामस्वरूप देखा गया होता startScan()


11
Google का दावा है कि यह बग मुझे ठंडा नहीं छोड़ता है। उनका रवैया सादे बी.एस.
मार्की

21
यह वास्तव में एक बग नहीं है - यदि कोई दुर्भावनापूर्ण ऐप डेवलपर ज्ञात ब्लूटूथ बीकन के लिए स्कैन कर सकता है, तो वे स्थान अनुमतियों के बारे में पूछकर उपयोगकर्ता के संदेह को बढ़ाए बिना आपके स्थान का पता लगा सकते हैं। तो BLE पहुंच के लिए पूछना दुर्भाग्य से आपके किसी न किसी स्थान के लिए पूछ के रूप में ही व्यवहार किया जाना चाहिए।
ArtHare

3
@orionelenzil "आपको घोषित होने वाली दूसरी अनुमति या तो ACCESS_COARSE_LOCATION या ACCESS_FINE_LOCATION है। स्थान की अनुमति की आवश्यकता है क्योंकि ब्लूटूथ स्कैन का उपयोग उपयोगकर्ता के स्थान के बारे में जानकारी इकट्ठा करने के लिए किया जा सकता है।" से developer.android.com/guide/topics/connectivity/bluetooth
ArtHare

7
मुझे देखने दो कि क्या मेरे पास यह सीधा है। BLE का महान लाभ "LE" बिट, यानी कम ऊर्जा है, जिसका अर्थ है कि मेरी बैटरी पर नाली कम हो गई है। बेशक, उन बचत को प्राप्त करने के लिए, मुझे जीपीएस चालू करना होगा, जो कि एक ज्ञात बैटरी हॉग है, इस प्रकार किसी भी बिजली बचत की उपेक्षा करना जो मुझे बीएलई के उपयोग से मिल सकती है। / मुझे अविश्वास में सिर हिलाता है।
dgnuff

8
बहुत शानदार। निश्चित रूप से यदि Google को BLE स्कैन के बारे में पता था कि वह स्थान का उपयोग कर रहा है, तो उन्हें इसके लिए एक अलग अनुमति जोड़ी जानी चाहिए, न कि बच्चे को नहाने के पानी से बाहर फेंकने के बजाय उपयोगकर्ता को जीपीएस का उपयोग करने की अनुमति देकर!
डेस्टी

11

मैं सेट करके ऐसा हल targetSdkVersionकरने के लिए 22 Gradle फ़ाइल में। आपको ACCESS_COARSE_LOCATIONमेनिफ़ेस्ट में घोषणा करनी चाहिए लेकिन, BLE स्कैनिंग तब भी काम करेगी जब उपयोगकर्ता ऐप सेटिंग्स से इस अनुमति को अस्वीकार करता है।

स्थान की अनुमति का अनुरोध करने से बचने के लिए यह केवल एक हैक है। नवीनतम Android संस्करणों को लक्षित करना बेहतर है।

संपादित करें

इस समाधान का उपयोग अब नहीं किया जाना चाहिए क्योंकि Google Play को नए ऐप्स को कम से कम Android 8.0 (API स्तर 26) पर लक्षित करने की आवश्यकता होगी। एप्लिकेशन को BLE स्कैनिंग के लिए स्थान की अनुमति के लिए अनुरोध करना चाहिए।


बहुत धन्यवाद! क्या आपके पास एक विचार है कि पुस्तकालयों के साथ क्या करना है जो उदाहरण के लिए AltBeacon जैसी निगरानी का अनुकरण करता है? स्थान के बिना काम नहीं करते :( और वे मूल रूप से एक ही तंत्र का उपयोग कर रहे हैं ... और मिनट संकलन संस्करण के बारे में क्या? @JiTHiN
Shahar Lahav

23 से 22 तक डाउनग्रेड किया गया है और यह एंड्रॉइड 7.0 पर भी काम करता है। मेरी प्रारंभिक समस्या यह थी कि आपको स्थानीयकरण सक्षम करना था, अब मैं स्थानीयकरण के साथ BLE उपकरणों को अक्षम कर सकता हूं।
मारियस वियाज़ोव्स्की

1
यह एक हैक है, हालांकि यह महत्वपूर्ण नहीं है यह नवीनतम एसडीके संस्करणों को लक्षित करने के लिए हमेशा बेहतर होता है। ऐसा करने का उचित तरीका ACCESS_COARSE_LOCATIONरनटाइम में अनुरोध करना है
आरोन

2
यह कोई और समाधान नहीं है (देखें डेवलपर .android.com/distribute/best-practices/develop/… "Google Play को 1 अगस्त, 2018 से नए ऐप्स को कम से कम Android 8.0 (API स्तर 26) लक्ष्य की आवश्यकता होगी, और ऐप अपडेट 1 नवंबर, 2018 से एंड्रॉइड 8.0 को लक्षित करता है। ")
6tienne

10

मैंने पाया कि Android 6 के बाद आपको ACCESS_COARSE_LOCATION अनुमति देनी चाहिए। लेकिन कुछ उपकरणों पर आपकी फ़ोन स्थान सेवा (GPS) को भी स्विच किया जाना आवश्यक है, ताकि आप परिधीय उपकरणों की खोज कर सकें। मैंने पाया कि Android 7.0 के साथ Nexus 5x का उपयोग किया जा रहा है।


1
नेक्सस 5x और एंड्रॉयड 6 के साथ मेरे लिए एक ही
protectedmember

एंड्रॉइड 7.1.1 के साथ मोटो जी 5 प्लस पर भी
रूटकोड

2

मैंने इसे भी प्रकट करने की कोशिश की, लेकिन अनुमति का अनुरोध नहीं किया, निश्चित रूप से क्यों नहीं। क्या आप स्टार्टअप पर स्थान की अनुमति के लिए एप्लिकेशन का संकेत दे रहे हैं? यदि ऐसा नहीं है, तो हमें रनटाइम पर अनुमति के लिए अनुरोध करना होगा

यदि आपका ऐप ठीक काम कर रहा है, तो भी आप इसकी जांच कर सकते हैं:

सेटिंग खोलें> ऐप्स> YourApplication> अनुमतियाँ और स्थान सक्षम करें और फिर परिणामों के लिए स्कैन करने का प्रयास करें।

स्थान केवल तभी सूचीबद्ध किया जाएगा जब आपने प्रकट होने पर ACCESS_COARSE_LOCATION प्रदान किया हो।


1
हाँ, आपको स्पष्ट रूप से रनटाइम पर अनुमति के साथ-साथ डिवाइस के लिए स्थान सेवाओं को चालू करना होगा। लेकिन मैं सोच रहा था कि क्या स्थान सेवाओं को चालू करने या रनटाइम पर पाठ्यक्रम स्थान की अनुमति का अनुरोध किए बिना एक BLE स्कैन करने का कोई तरीका था।
V-PTR

अनुरोध करने की अनुमति पर्याप्त नहीं है, आपको यह जांचने की आवश्यकता है कि क्या स्थान सेवाएँ सक्षम हैं या नहीं।
drindt

2

आप उपयोग कर सकते हैं BluetoothAdapter.startDiscovery()
यह ब्लूटूथ स्मार्ट और क्लासिक ब्लूटूथ डिवाइस दोनों के लिए स्कैन करेगा, लेकिन स्थान सेवाओं को सक्षम करने की आवश्यकता नहीं है।
(आपको अभी भी ACCESS_COARSE_LOCATIONAndroid 6 पर अनुमति की आवश्यकता है )

आप BluetoothDevice.getTypeब्लूटूथ स्मार्ट / कम ऊर्जा उपकरणों के लिए फ़िल्टर करने के लिए पाए गए उपकरणों पर कॉल कर सकते हैं ।


0

खैर, मैंने एक्लिप्स में लिखे अपने कोड को देखा है और मैं प्रकट फ़ाइल में स्थान के सामान की घोषणा किए बिना स्टार्टस्कैन (एपीआई 21) फ़ंक्शन का उपयोग करता हूं। मुझे अभी भी उचित कॉलबैक मिलता है। क्या आपने स्थान घोषणा के बिना कोड चलाने की कोशिश की है? दूसरे हाथ में - आप डिप्रेस्ड स्टार्ट लैंसकैन (एपीआई 18) का उपयोग कर सकते हैं जिसके लिए इन अनुमतियों की आवश्यकता नहीं है। हालांकि, मेरी राय में सेवा में वांछित विशेषता की खोज और पढ़ना एपीआई 18 विधियों के साथ अधिक जटिल है।


में startScanफ़ंक्शन का उपयोग कर रहा हूं BluetoothLeScanner। मैं गैर-पदावनत विधियों का उपयोग जानबूझकर कर रहा हूं। वास्तव में, मैं उन उपकरणों के लिए जाँच कर रहा हूं जो विशेष रूप से प्रदान किए गए नए तरीकों का उपयोग करने के लिए 21 से अधिक एपीआई का उपयोग कर रहे हैं। मैंने स्थान के बिना कोशिश की और यह बस चुपचाप विफल रहता है। स्कैनिंग चलती है, लेकिन कुछ भी नहीं लौटाया जाता है (पोस्ट-एपीआई 21 विधि का उपयोग करके)
वी-पीटीआर

0

हाल ही में मैंने एंड्रॉइड 8.0 पर जो देखा है, उससे आपको BLE स्कैन करने के लिए अपने GPS को चालू करने की आवश्यकता नहीं है, लेकिन आपको इसे घोषणा में घोषित करना होगा, लेकिन उपयोगकर्ता को अनुमति देनी होगी।

जब आप startScan()विधि के साथ स्कैन करने का प्रयास करते हैं, तो Android उपयोगकर्ता को स्थान की अनुमति देने के लिए संकेत देगा । यदि अनुमति नहीं दी गई तो आपका स्कैन विफल हो जाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.