2012-03-13 35 views
52

Tôi có một ứng dụng có nút trên đó tôi sử dụng để bật và tắt BT. Tôi có mã sau đây trong đó;Phát hiện các thay đổi trạng thái được thực hiện cho BluetoothAdapter?

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(); 
    } 
} 

Tôi đang gọi nút Flip, lật trạng thái BT, sau đó gọi ButtonText, cập nhật giao diện người dùng. Tuy nhiên, vấn đề tôi gặp phải là phải mất vài giây để BT bật - và trong những giây này, trạng thái BT không được bật, làm cho nút của tôi tắt Bluetooth, ngay cả khi nó sẽ bật sau 2 giây.

Tôi tìm thấy hằng số STATE_CONNECTING trong tài liệu android BluetoothAdapter, nhưng ... Tôi chỉ đơn giản là không biết cách sử dụng nó, là một newbie và tất cả.

Vì vậy, tôi đã có hai câu hỏi:

  1. Có cách nào để tự động buộc một yếu tố giao diện người dùng (ví dụ như một nút hoặc hình ảnh) sang trạng thái BT, do đó khi thay đổi trạng thái BT, nút cũng sẽ thay đổi?
  2. Nếu không, tôi muốn nhấn nút và nhận trạng thái chính xác (Tôi muốn nói BT, ngay cả khi nó chỉ kết nối, vì nó sẽ được bật sau 2 giây). Làm thế nào để tôi làm điều này?
+0

bạn không thể sử dụng một boolean và đặt nó vào đúng một lần BT bắt đầu bật, sau đó kiểm tra tình trạng boolean để thay đổi nút? –

+0

Hãy xem mã AOSP này để có cảm nhận về cách họ theo dõi các thay đổi bật/tắt bluetooth: http://androidxref.com/5.1.0_r1/xref/frameworks/base/services/core/java/com/ android/server/BluetoothManagerService.java –

Trả lời

149

Bạn sẽ muốn đăng ký một BroadcastReceiver để lắng nghe bất kỳ thay đổi trong trạng thái của BluetoothAdapter:

Là một biến Ví dụ tin trong bạn Activity (hoặc trong một tập tin lớp riêng biệt ... bất cứ ai bạn thích):

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; 
      } 
     } 
    } 
}; 

Lưu ý rằng điều này giả định rằng Activity bạn thực hiện một phương pháp setButtonText(String text) đó sẽ thay đổi văn bản 's Button cho phù hợp.

Và sau đó trong Activity của bạn, đăng ký và unregister BroadcastReceiver như sau,

@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

Alex, điều này gần như hoạt động. một vài thứ. đầu tiên, tôi nghĩ rằng bạn có nghĩa là để đăng ký BluetoothAdapter, không BluetoothDevice, kể từ BluetoothDevice là khi bạn ghép nối thiết bị, và nó chỉ có một BluetoothDevice.ACTION_BOND_STATE_CHANGED, mà sẽ không áp dụng ở đây. Tôi cũng đã thêm một; sau khi mã broadcastReceiver (tôi chỉ viết điều này cho những người tương lai, những người sẽ có cùng một vấn đề và đọc điều này), tuy nhiên, tôi nhận được một "Java.lang.RuntimeException: Không thể khởi tạo hoạt động ComponentInfo", thường có nghĩa là hoạt động của tôi không được đăng ký trong tệp kê khai-tôi có cần đăng ký người nhận trong đó không? – raingod

+0

ha! Tôi là một thằng ngốc :) Tôi đã tìm ra vấn đề của mình. vì vậy, vâng, ngoài những điều mã tôi đã đề cập ở trên, điều này hoạt động đẹp :) cảm ơn Alex! – raingod

+0

không sao cả! xin lỗi về lỗi chính tả ... khi tôi đang gõ nó lên tôi biết phải có một cặp vợ chồng :). –

Các vấn đề liên quan