2013-02-09 37 views
7

मैं पता लगाने के लिए कि क्या एक ब्लूटूथ डिवाइस वर्तमान में एपीआई 14 या बेहतर उपयोग करते हुए एक Android डिवाइस से जुड़ा है कोशिश कर रहा हूँ देता है। ऐसा लगता है कि मुझे BluetoothSocket.is कनेक्टेड() विधि का उपयोग करने में सक्षम होना चाहिए, लेकिन इससे कोई फर्क नहीं पड़ता कि मैंने क्या किया है, अब तक मुझे कुछ भी जुड़ा हुआ है, जुड़ा हुआ है या नहीं। ,एंड्रॉयड BluetoothSocket.isConnected हमेशा गलत

protected void onCreate(final Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices(); 

    for (BluetoothDevice device : pairedDevices) { 
     Log.i(Constants.LOG_TAG, String.format(Locale.US, "Device: %s connected: %b", device.getName(), isConnected(device))); //$NON-NLS-1$z 
    } 
} 

private boolean isConnected(BluetoothDevice device) { 
    BluetoothSocket socket = null; 

    // Get a BluetoothSocket for a connection with the given BluetoothDevice 
    UUID SPP_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 
    try { 
     socket = device.createRfcommSocketToServiceRecord(SPP_UUID); 
    } catch (IOException e) { 
     Log.e(Constants.LOG_TAG, e.getMessage()); //$NON-NLS-1$z 
     return false; 
    } 

    Log.i(Constants.LOG_TAG, socket.toString()); //$NON-NLS-1$z 

    return socket.isConnected(); 
} 

कोई त्रुटि नहीं फेंक दिया जाता है यह बस रिटर्न "गलत" समय की 100%:

<uses-permission android:name="android.permission.BLUETOOTH" /> 
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 

<!-- Locale 4.x supports API 14 or greater. --> 
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="17" /> 

<uses-feature android:name="android.hardware.bluetooth" /> 

और प्रश्न में कोड:

AndroidManifest इन पंक्तियों के भी शामिल है। क्या ऐसा कुछ है जो मैं सही नहीं कर रहा हूं?

उत्तर

0

सबसे पहले, तुम क्यों प्रतिबिंब का उपयोग कर रहे हैं ?! यह मेरे लिए एक लाल झंडा है। एपीआई आपको ब्लूटूथ के माध्यम से किसी अन्य डिवाइस से बात करने की अनुमति देता है, this link देखें ताकि आपको प्रतिबिंब का उपयोग न करना चाहिए।

एक सॉकेट हमेशा अपने connect विधि कहा जाता है से पहले कनेक्ट नहीं वापस आ जाएगी। ऐसा लगता है कि आपका कोड सॉकेट प्राप्त करता है लेकिन इसके साथ कनेक्शन बनाने का प्रयास नहीं करता है। आपको पहले this method पर कॉल करने की आवश्यकता है।

+0

प्रतिबिंब भाग इस प्रश्न के स्वीकृत उत्तर से आया: http://stackoverflow.com/questions/3397071/service-discovery-failed-exception-using-bluetooth-on-android।मैं प्रतिबिंब के विचार से रोमांचित नहीं था, लेकिन मुझे लगता है कि मुझे कहीं और पढ़ना याद है कि आपको मूल प्रश्न से यूयूआईडी पर भरोसा नहीं करना चाहिए। यह कहकर, मेरे लिए महत्वपूर्ण मुद्दा आपके उत्तर का दूसरा हिस्सा है - मैं किसी भी बीटी डिवाइस को खोजने की कोशिश कर रहा हूं, जो किसी भी कनेक्ट करने की कोशिश नहीं कर रहा है। क्या यह संभव नहीं है? मैं बीटी राज्य परिवर्तनों की निगरानी के लिए एक सेवा बनाने से बचने की कोशिश कर रहा हूं। – jkane001

+0

एसओ उत्तर और एंड्रॉइड दस्तावेज़ों के बारे में अधिक सावधानीपूर्वक पढ़ने के बाद अमीन सही थे, मुझे एहसास हुआ कि यहां प्रतिबिंब आवश्यक नहीं था। मैंने अपने मूल प्रश्न को एक बेहतर "कनेक्ट कनेक्ट" विधि के साथ अपडेट किया है, लेकिन मेरा प्रश्न बनी हुई है: क्या यह पता लगाने का कोई तरीका है कि कोई बीटी डिवाइस कनेक्ट होने के बिना कनेक्ट किया गया है या नहीं? – jkane001

2

मुझे विश्वास है कि jkane001 पहले से ही अपने समस्या हल हो, इसलिए मुझे आशा है कि इस सवाल का जवाब किसी और में मदद मिलेगी।

सॉकेट निर्माण के बाद सबसे पहले

socket = device.createRfcommSocketToServiceRecord(SPP_UUID); 

आप द्वारा

socket.connect(); 

कनेक्शन उसके बाद init जाएगा आप का उपयोग कर socket.isConnected()

के बाद से connect() विधि है कनेक्शन स्थिति जांचने के लिए सक्षम हो जाएगा अवरुद्ध नहीं, इसलिए सॉकेट के तुरंत बाद कनेक्ट नहीं हो सकता है। मैं इस

while(!socket.isConnected() && trial++ < 3){ 
    try { 
     Thread.sleep(300); 
    } catch (Exception e) {} 
} 

की तरह कुछ का उपयोग करने के वैसे सुझाव है, मैंने पाया कि कुछ Android डिवाइस पर isConnected() हमेशा गलत देता है। ऐसे मामले में बस सॉकेट में कुछ लिखने की कोशिश करें और जांच करें कि कोई अपवाद नहीं है या नहीं।

+0

मुझे पता चला है कि खराब सिग्नल के कारण कनेक्शन खो जाने के बाद, यदि कनेक्ट किया गया है() कहा जाता है, तो यह अभी भी सत्य लौटाता है। तो मैंने सॉकेट में कुछ भेजने और अपवाद को पकड़ने का सहारा लिया है। – VectorVictor

+0

@ वेक्टर विक्टर सही। कनेक्टेड() कनेक्शन को जीवित करने की जांच करने के लिए एक विश्वसनीय तरीका नहीं है। – Alex

2

स्पष्ट रूप से डिवाइस और/या एंड्रॉइड संस्करण हैं जहां कनेक्ट किया गया है() लागू किया गया है (यानी फ़ंक्शन मौजूद है और आप इसे कॉल कर सकते हैं), लेकिन बेकार से भी बदतर है क्योंकि यह हमेशा झूठा होता है। मेरे पास एंड्रॉइड 4.2.2 चलाने वाली मेरी डेस्क पर एक अल्काटेल फोन है जो इस व्यवहार को प्रदर्शित करता है।

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

हम क्षेत्र है कि इसी तरह ध्वनि से रिपोर्ट है, और 2 समस्या उपकरणों जिसके लिए हम संस्करण पता के 2 4.2.2 पर भी हैं। अभी तक फ़िक्स को तैनात नहीं किया है, इसलिए सुनिश्चित नहीं है कि यह अभी तक उन मामलों को ठीक कर चुका है या नहीं।