Broadcast ReceiverでBluetoothの状態変化をキャッチしようとしています。
私のマニフェスト:
<uses-permission Android:name="Android.permission.BLUETOOTH" />
<application>
<activity
Android:name=".MainActivity"
Android:label="@string/app_name" >
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver Android:name=".BluetoothBroadcastReceiver"
Android:label="@string/app_name">
<intent-filter>
<action Android:name="Android.bluetooth.adapter.action.STATE_CHANGED" />
<action Android:name="Android.bluetooth.adapter.action.CONNECTION_STATE_CHANGED" />
<action Android:name="Android.bluetooth.device.action.ACL_CONNECTED" />
<action Android:name="Android.bluetooth.device.action.ACL_DISCONNECTED" />
</intent-filter>
</receiver>
</application>
レシーバーonReceive
メソッド:
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Log.d("BroadcastActions", "Action "+action+"received");
int state;
BluetoothDevice bluetoothDevice;
switch(action)
{
case BluetoothAdapter.ACTION_STATE_CHANGED:
state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1);
if (state == BluetoothAdapter.STATE_OFF)
{
Toast.makeText(context, "Bluetooth is off", Toast.LENGTH_SHORT).show();
Log.d("BroadcastActions", "Bluetooth is off");
}
else if (state == BluetoothAdapter.STATE_TURNING_OFF)
{
Toast.makeText(context, "Bluetooth is turning off", Toast.LENGTH_SHORT).show();
Log.d("BroadcastActions", "Bluetooth is turning off");
}
else if(state == BluetoothAdapter.STATE_ON)
{
Log.d("BroadcastActions", "Bluetooth is on");
}
break;
case BluetoothDevice.ACTION_ACL_CONNECTED:
bluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
Toast.makeText(context, "Connected to "+bluetoothDevice.getName(),
Toast.LENGTH_SHORT).show();
Log.d("BroadcastActions", "Connected to "+bluetoothDevice.getName());
break;
case BluetoothDevice.ACTION_ACL_DISCONNECTED:
bluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
Toast.makeText(context, "Disconnected from "+bluetoothDevice.getName(),
Toast.LENGTH_SHORT).show();
break;
}
}
アプリを起動し、ホームボタンを押して最小化します。設定に移動して、Bluetoothをオンにしますが、何も起こりません。私はトーストとlogcatメッセージを期待していますが。ここで何が問題なのですか?
Bluetoothの状態の変化(_STATE_OFF
_、_STATE_TURNING_ON
_、_STATE_ON
_、_STATE_TURNING_OFF
_)をキャッチするには、アクティビティでこれを行います:
まず、AndroidManifestファイルにBluetooth許可を追加します。
_<uses-permission Android:name="Android.permission.BLUETOOTH" />
_
アクティビティまたはサービスでBroadcastReceiverを作成します。
_ private final BroadcastReceiver mBroadcastReceiver1 = 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:
..
break;
case BluetoothAdapter.STATE_TURNING_OFF:
..
break;
case BluetoothAdapter.STATE_ON:
..
break;
case BluetoothAdapter.STATE_TURNING_ON:
..
break;
}
}
}
};
_
IntentFilterを作成し、onCreate()
メソッドのActivity/ServiceにBroadcastReceiverで登録します。
_@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
IntentFilter filter1 = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
registerReceiver(mBroadcastReceiver1, filter1);
...
}
_
BroadcastReceiverをonDestroy()
メソッドで登録解除します:
_@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mBroadcastReceiver1);
}
_
デバイスの検出可能性の変化(_SCAN_MODE_NONE
_、_SCAN_MODE_CONNECTABLE
_、_SCAN_MODE_CONNECTABLE_DISCOVERABLE
_)をキャッチするには、別のBroadcastReceiverを作成し、上記のようにアクティビティに登録/登録解除します。これらのBroadcastReceiverの違いは、最初は_BluetoothAdapter.EXTRA_STATE
_を使用し、もう1つは_BluetoothAdapter.EXTRA_SCAN_MODE
_を使用することだけです。以下は、発見可能性の変化をキャッチするBroadcastReceiverのサンプルコードです。
フィルターを作成し、onCreate()
メソッドに登録します。
_IntentFilter filter2 = new IntentFilter();
filter2.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
filter2.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
filter2.addAction(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);
registerReceiver(mBroadcastReceiver2, filter2);
_
Activity/ServiceでBroadcastReciverを作成して、検出可能性の変更をキャッチします。
_ private final BroadcastReceiver mBroadcastReceiver2 = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if(action.equals(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED)) {
int mode = intent.getIntExtra(BluetoothAdapter.EXTRA_SCAN_MODE, BluetoothAdapter.ERROR);
switch(mode){
case BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE:
..
break;
case BluetoothAdapter.SCAN_MODE_CONNECTABLE:
..
break;
case BluetoothAdapter.SCAN_MODE_NONE:
..
break;
}
}
}
};
_
最後に、onDestroy()
で登録を解除します。
_unregisterReceiver(mBroadcastReceiver2);
_
もちろん、Bluetooth許可を追加する必要がある場合を除き、AndroidManifestファイルに_<intent-filter>
_または_<receiver>
_を追加する必要はありません。
(_ACTION_ACL_CONNECTED
_、_ACTION_ACL_DISCONNECTED
_、_ACTION_ACL_DISCONNECT_REQUESTED
_)をキャッチしたい場合は、AndroidManifestファイルに_<intent-filter>
_を追加する必要があります。
_<intent-filter>
<action Android:name="Android.bluetooth.device.action.ACL_CONNECTED" />
<action Android:name="Android.bluetooth.device.action.ACL_DISCONNECTED" />
</intent-filter>
_
フィルターを作成し、onCreate()
メソッドに登録します。
_IntentFilter filter3 = new IntentFilter();
filter3.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);
filter3.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);
registerReceiver(mBroadcastReceiver3, filter3);
_
次に、アクティビティ/サービスでBroadcastReceiverを作成します。
_ private final BroadcastReceiver mBroadcastReceiver3 = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
switch (action){
case BluetoothDevice.ACTION_ACL_CONNECTED:
..
break;
case BluetoothDevice.ACTION_ACL_DISCONNECTED:
..
break;
}
}
};
_
最後に、登録を解除します。
_unregisterReceiver(mBroadcastReceiver3);
_
状態定数について詳しく知りたい場合は、ドキュメントから入手できます。
public static final String EXTRA_STATE :
現在の電源状態を要求するために、ACTION_STATE_CHANGEDインテントのint余分なフィールドとして使用されます。可能な値は次のとおりです。STATE_OFF、STATE_TURNING_ON、STATE_ON、STATE_TURNING_OFF
public static final String EXTRA_SCAN_MODE :
現在のスキャンモードを要求するために、ACTION_SCAN_MODE_CHANGEDインテントのint余分なフィールドとして使用されます。可能な値は次のとおりです。SCAN_MODE_NONE、SCAN_MODE_CONNECTABLE、SCAN_MODE_CONNECTABLE_DISCOVERABLE
あなたの主な問題;)文字列の比較に「スイッチ」を使用することはできません。
少なくともVERSION_INT 18まで(包括的)。バージョン19はJava 7。