2011-11-07 31 views
6

मेरे पास एसपीपी प्रोफाइल और ब्लूटूथ संस्करण 2.1 के साथ ब्लूटूथ डिवाइस है।
मेरे पास एक ऐप है जो उस डिवाइस से जुड़ता है और इसके साथ संवाद करता है। डिवाइस "जस्ट वर्क्स" जोड़ी तकनीक का उपयोग करता है।एंड्रॉइड ब्लूटूथ: युग्मित डिवाइस सूची

मैं सैमसंग गैलेक्सी टैबलेट की तरह कुछ फ़ोन पर एक समस्या का सामना करना पड़ रहा हूँ, गैलेक्सी एस

समस्या मैं सॉकेट बंद करने कर रहा हूँ और डिवाइस से डिस्कनेक्ट, app से उपयोगकर्ता बाहर निकलता है के बाद है। सफल डिस्कनेक्शन के बाद, यह देखा गया है कि डिवाइस की प्रविष्टि युग्मित डिवाइस सूची से हटा दी गई है।

उत्तर

13

मैंने टैबलेट के साथ काम नहीं किया है, लेकिन मैंने एक ऐप लिखा है जो एंड्रॉइड फोन के लिए एसपीपी का इस्तेमाल करता है। मुझे जो मिला वह यह था कि ब्लूटूथ स्थिर होने के लिए, मुझे उस डिवाइस के साथ मैन्युअल रूप से बंधन करना है जिसके साथ मैं संवाद करना चाहता हूं। हमने ऐप के भीतर से शुरू होने वाले बॉन्डिंग के लिए नीचे दिए गए कोड का उपयोग किया था, और इसे बॉन्डिंग को सुरक्षित रखना चाहिए जैसे कि आपने सेटिंग मेनू के माध्यम से मैन्युअल रूप से जोड़ा है। 1) एक BroadcastReceiver रजिस्टर आप एक BluetoothDevice वस्तु होना चाहिए BluetoothDevice.ACTION_BOND_STATE_CHANGED
2) के बाद डिवाइस खोज के लिए सुनने के लिए:

यहाँ सामान्य प्रवाह है।
3) का प्रयोग करें एक BluetoothDeviceObject
3a पर 'createBond' विधि कॉल करने के) खोलने सॉकेट

BluetoothDevice device = {obtained from device discovery}; 
Method m = device.getClass().getMethod("createBond", (Class[])null); 
m.invoke(device, (Object[])null); 

int bondState = device.getBondState(); 
if (bondState == BluetoothDevice.BOND_NONE || bondState == BluetoothDevice.BOND_BONDING) 
{ 
    waitingForBonding = true; // Class variable used later in the broadcast receiver 

    // Also...I have the whole bluetooth session running on a thread. This was a key point for me. If the bond state is not BOND_BONDED, I wait here. Then see the snippets below 
    synchronized(this) 
    { 
     wait(); 
    } 
} 

4) से पहले बांड स्थिति परिवर्तन की घटनाओं के लिए प्रतीक्षा करें रुको बंधन राज्य के लिए BOND_BONDED

को BOND_BONDING से बदलने के लिए प्रतिबिंब

एक BroadcastReciever के अंदर:

public void onReceive(Context context, Intent intent) 
{ 
    if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(intent.getAction())) 
    { 
     int prevBondState = intent.getIntExtra(BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE, -1); 
     int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, -1); 

     if (waitingForBonding) 
     { 
      if (prevBondState == BluetoothDevice.BOND_BONDING) 
      { 
       // check for both BONDED and NONE here because in some error cases the bonding fails and we need to fail gracefully. 
       if (bondState == BluetoothDevice.BOND_BONDED || bondState == BluetoothDevice.BOND_NONE) 
       { 
        // safely notify your thread to continue 
       } 
      } 
     } 
    } 
} 

5) ओपन सॉकेट और

संवाद

आप जोड़ीकरण सूची से अपने डिवाइस को हटाने के लिए प्रतिबिंब के माध्यम से 'removeBond' विधि भी कर सकते हैं।

आशा है कि इससे मदद मिलती है!

0

यदि युग्मन आपके ऐप कनेक्टिंग के परिणामस्वरूप हो रहा है, तो मुझे लगता है कि कुछ डिवाइस इसे अस्थायी जोड़ी के रूप में मानेंगे और कनेक्शन डिस्कनेक्ट होने के बाद डिवाइस को युग्मित सूची में नहीं रखेंगे। युग्मित सूची में डिवाइस को बनाए रखने के लिए आपको मैन्युअल रूप से ब्लूटूथ सेटिंग्स मेनू के माध्यम से जोड़ना चाहिए। एक बार जोड़ा गया आपका प्रोग्राम कनेक्ट/डिस्कनेक्ट कर सकता है और डिवाइस युग्मित सूची में खुद को बनाए रखेगा।

+0

मैं इस अस्थायी जोड़ी व्यवहार के लिए विवरण कहां देखूँगा; एंड्रॉइड प्रलेखन या ब्लूटूथ 2।1 विनिर्देश दस्तावेज? यदि यह एंड्रॉइड मुद्दा है, तो यह सभी फोन पर पुन: उत्पन्न होगा। या यह ब्लूटूथ स्टैक पर निर्माता कार्यान्वयन से संबंधित है? – Ashwini

+0

यह निर्माता निर्भर करता है कि यह किस विकल्प को जोड़ी/बॉन्ड बनाम अस्थायी कनेक्शन के लिए प्रमाणित करता है। युग्मन के लिए आमतौर पर स्पष्ट कार्रवाई (जो कि युग्मित डिवाइस को सहेजने का तात्पर्य है सिस्टम ब्लूटूथ - सेटिंग्स मेनू के माध्यम से है) –

0

मुझे सोनी एक्सपीरिया एक्स 10 के साथ भी एक ही समस्या का अनुभव हुआ। मैं ब्लूटूथ डिवाइस पक्ष पर सुरक्षा स्तर सेटिंग्स को बदलकर जोड़ों को "याद" करने में कामयाब रहा (जैसा कि मैं डिवाइस भी विकसित कर रहा हूं)।

मुझे "अस्थायी जोड़ी" स्पष्टीकरण के बारे में निश्चित नहीं है, जो निर्माता निर्भर होगा, यह बहुत समझ में नहीं आता है कि विभिन्न फोन एक ही डिवाइस के साथ कनेक्शन के लिए अलग-अलग प्रतिक्रिया देंगे।

हालांकि यह अनजान हिस्सा है जो मेरे लिए एक समस्या है। आम तौर पर ब्लूटूथ स्टैक क्रैश प्रतीत होता है जब उपयोगकर्ता पृष्ठभूमि में कनेक्ट होने पर डिवाइस को अनपेक्षित कर रहा है। मुझे अभी भी यह पता नहीं लगा है कि ACTION_BOND_STATE_CHANGED ईवेंट को सही तरीके से कैसे प्रबंधित करें।

+0

क्या आप मुझे बता सकते हैं कि युग्मित डिवाइस सूची में डिवाइस को याद रखने के लिए कौन सी सुरक्षा स्तर सेटिंग की आवश्यकता है? मैं एंड्रॉइड 3.0+ के साथ टैबलेट पर इसे आसानी से पुन: पेश कर सकता हूं, इसलिए मैंने सोचा कि यह एंड्रॉइड संस्करण से संबंधित है। – Ashwini

+0

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

संबंधित मुद्दे