2012-03-13 23 views
52

मेरे पास एक बटन वाला एक ऐप है जिसका उपयोग मैं बीटी चालू और बंद करने के लिए करता हूं। मेरे पास निम्नलिखित कोड है;ब्लूटूथ एडाप्टर में किए गए राज्य परिवर्तनों का पता लगाना?

public void buttonFlip(View view) { 
    flipBT(); 
    buttonText(view); 
} 

public void buttonText(View view) { 
    Button buttonText = (Button) findViewById(R.id.button1); 
    if (mBluetoothAdapter.isEnabled() || (mBluetoothAdapter.a)) { 
     buttonText.setText(R.string.bluetooth_on); 
    } else { 
     buttonText.setText(R.string.bluetooth_off); 
    } 
} 

private void flipBT() { 
    if (mBluetoothAdapter.isEnabled()) { 
     mBluetoothAdapter.disable();  
    } else { 
     mBluetoothAdapter.enable(); 
    } 
} 

मैं बटन फ्लिप, जो बीटी राज्य flips, और फिर ButtonText कहता है, जो यूआई अद्यतन करना चाहिए फोन कर रहा हूँ। हालांकि, मेरे पास जो मुद्दा है, बीटी के चालू होने में कुछ सेकंड लगते हैं - और इन सेकंड के दौरान, बीटी स्थिति सक्षम नहीं है, जिससे मेरा बटन ब्लूटूथ बंद हो जाता है, भले ही यह 2 सेकंड में हो।

मुझे ब्लूटूथ एडाप्टर एंड्रॉइड दस्तावेज में STATE_CONNECTING स्थिर मिला, लेकिन ... मुझे बस यह नहीं पता कि इसका उपयोग कैसे किया जाए, नौसिखिया और सब कुछ।

तो, मुझे मिल गया है दो सवाल:

  1. वहाँ एक रास्ता गतिशील रूप से एक यूआई तत्व एक बीटी राज्य के लिए टाई (जैसे कि एक बटन या छवि के रूप में) है, ताकि जब बीटी राज्य में परिवर्तन, बटन भी बदल जाएगा?
  2. अन्यथा, मैं बटन दबाकर सही स्थिति प्राप्त करना चाहता हूं (मैं इसे बीटी पर कहना चाहूंगा, भले ही यह केवल कनेक्ट हो रहा हो, क्योंकि यह 2 सेकंड में होगा)। मैं यह कैसे करु?
+0

आप एक बूलियन उपयोग नहीं कर सकते और सच के लिए सेट एक बार बीटी को चालू करने से शुरू होता है, तो बूलियन राज्य जाँच बदलने के लिए बटन? –

+0

ब्लूटूथ चालू/बंद परिवर्तनों को ट्रैक करने के तरीके के बारे में महसूस करने के लिए इस एओएसपी कोड पर एक नज़र डालें: http://androidxref.com/5.1.0_r1/xref/frameworks/base/services/core/java/com/ एंड्रॉइड/सर्वर/BluetoothManagerService.java –

उत्तर

149

आप एक BroadcastReceiver रजिस्टर करने के लिए BluetoothAdapter के राज्य में किसी भी परिवर्तन के लिए सुनना चाहते हैं जाएगा: में

एक निजी उदाहरण चर के रूप में अपने Activity (या एक अलग वर्ग फ़ाइल ... जो भी आप एक में पसंद करते हैं):

private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     final String action = intent.getAction(); 

     if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) { 
      final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 
               BluetoothAdapter.ERROR); 
      switch (state) { 
      case BluetoothAdapter.STATE_OFF: 
       setButtonText("Bluetooth off"); 
       break; 
      case BluetoothAdapter.STATE_TURNING_OFF: 
       setButtonText("Turning Bluetooth off..."); 
       break; 
      case BluetoothAdapter.STATE_ON: 
       setButtonText("Bluetooth on"); 
       break; 
      case BluetoothAdapter.STATE_TURNING_ON: 
       setButtonText("Turning Bluetooth on..."); 
       break; 
      } 
     } 
    } 
}; 

नोट इस मान लिया गया है कि आपके Activity एक विधि setButtonText(String text) कि तदनुसार Button के पाठ बदल जाएगा लागू करता है।

और फिर अपने Activity में रजिस्टर और इस प्रकार BroadcastReceiver अपंजीकृत,

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    /* ... */ 

    // Register for broadcasts on BluetoothAdapter state change 
    IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); 
    registerReceiver(mReceiver, filter); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 

    /* ... */ 

    // Unregister broadcast listeners 
    unregisterReceiver(mReceiver); 
} 
+0

एलेक्स, यह लगभग काम करता है। कुछ बातें। सबसे पहले, मुझे लगता है कि ब्लूटूथ एडाप्टर को ब्लूटूथडेविस नहीं करना है, क्योंकि ब्लूटूथडिवाइस जब आप डिवाइस को जोड़ते हैं, और इसमें केवल ब्लूटूथडिवाइस है। ACTION_BOND_STATE_CHANGED, जो यहां लागू नहीं होगा। मैंने भी एक जोड़ा; प्रसारण रिसीवर कोड के बाद (मैं केवल भविष्य के लोगों के लिए इसे लिख रहा हूं, जिनके पास एक ही समस्या होगी और इसे पढ़ें), हालांकि, मुझे "Java.lang.RuntimeException: गतिविधि ComponentInfo को चालू करने में असमर्थ" हो रहा है, जिसका आमतौर पर मतलब है मेरी गतिविधि मैनिफेस्ट में पंजीकृत नहीं है-क्या मुझे वहां रिसीवर पंजीकृत करने की आवश्यकता है? – raingod

+0

हे! मैं मूर्ख हूँ :) मैंने अपनी समस्या का पता लगाया। तो, हाँ, कोड चीजों के अलावा मैंने वहां उल्लेख किया है, यह खूबसूरती से काम करता है :) धन्यवाद एलेक्स! – raingod

+0

कोई समस्या नहीं! टाइपो के बारे में खेद है ... क्योंकि मैं इसे लिख रहा था मुझे पता था कि एक जोड़े होना चाहिए :)। –

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