2012-03-13 11 views
52

私は、BTをオンまたはオフにするためのボタンが付いたアプリを持っています。私はそこに次のコードを持っています。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(); 
    } 
} 

私はBTの状態を反転させ、UIを更新するButtonTextを呼び出すボタンFlipを呼び出しています。しかし、私が抱えている問題は、BTがオンになるのに数秒かかることです。この秒の間に、BTのステータスが有効にならず、ボタンが2秒後にオンになってもBluetoothがオフになっています。

私はBluetoothAdapter androidのマニュアルでSTATE_CONNECTING定数を見つけましたが...私はそれを使用する方法を知らないだけで、初心者でもあります。

だから、私は2つの質問持っている:ときBTの状態が変化するよう

  1. は、動的BT状態に(ボタンや画像など)UI要素を結びつけるためにそこの方法です、ボタンも同様に変更されますか?
  2. そうでなければ、私はボタンを押して正しい状態にしたいと思うでしょう(私はそれが2秒でオンになるので、接続していてもBTをオンにしたいと思います)。これはどうすればいいですか?あなたがBluetoothAdapterの状態の変更をリッスンするようにBroadcastReceiverを登録したいと思うでしょう
+0

あなたはブール値を使用して、BTがオンに開始されると変更するboolean型の状態をチェックし、これをtrueに設定することはできませんボタン? –

+0

このAOSPコードを見て、ブルートゥースのオン/オフの変更をどのように追跡しているかを確認してください:http://androidxref.com/5.1.0_r1/xref/frameworks/base/services/core/java/com/ android/server/BluetoothManagerService.java –

答えて

149

プライベートインスタンス変数としてごActivity(または別のクラスファイル内に...どの1あなたを)好む:

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に応じButtonのテキストを変更します方法setButtonText(String text)を実装していることを前提としていること。

あなた 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

Alex、これはほとんど動作します。いくつかのこと。最初に、BluetoothDeviceはBluetoothDeviceではなくBluetoothAdapterを登録することを意味していると思います.BluetoothDeviceはデバイスをペア設定するときで、ここには適用されないBluetoothDevice.ACTION_BOND_STATE_CHANGEDしかありません。私はまたaを加えました。私は "Java.lang.RuntimeException:アクティビティComponentInfoをインスタンス化できません"と表示されています。これは通常、次のことを意味します。私の活動はマニフェストに登録されていません - 私はそこにレシーバーを登録する必要がありますか? – raingod

+0

ha!私はばかだ:)私は私の問題を理解した。ですから、私がそこで述べたコードのほかに、これは美しく動作します:)アレックスに感謝します! – raingod

+0

問題ありません!私はそれを入力していたとして、私はカップルでなければならないことが分かっていた:)。 –

関連する問題