使用可能なすべてのBluetoothデバイスを検索し、ユーザーがリスト内の要素をクリックしたときに、デバイスを選択したアドレスとペアリングして、検出をキャンセルしたいと思います。ただし、BluetoothアダプタでcancelDiscovery()を呼び出すと、常にfalseが返されます。Androidドキュメントでは、cancelDiscovery()がtrueを返すには、アダプターがSTATE_ONになっている必要があると記載されています。ただし、btAdapter.getState()を呼び出すと、値12、つまりSTATE_ONが返されます。私のコードは以下のとおりですが、他に何が間違っている可能性があるか誰かが知っていますか?
現在の状態がSTATE_ONの場合、cancelDiscovery()がどのようにfalseを返すのかわかりません。ドキュメントには、状態がSTATE_ONの場合はtrueを返し、他のすべての値の場合はfalseを返す必要があると記載されています。
private static final UUID MY_UUID = UUID.randomUUID();
private static final int REQUEST_ENABLE_BT = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnScanDevice = (Button) findViewById( R.id.scandevice );
stateBluetooth = (TextView) findViewById( R.id.bluetoothstate );
startBluetooth();
listDevicesFound = (ListView) findViewById( R.id.devicesfound );
btArrayAdapter = new ArrayAdapter<String>( AndroidBluetooth.this,
android.R.layout.simple_list_item_1 );
listDevicesFound.setAdapter( btArrayAdapter );
CheckBlueToothState();
btnScanDevice.setOnClickListener( btnScanDeviceOnClickListener );
registerReceiver( ActionFoundReceiver, new IntentFilter( BluetoothDevice.ACTION_FOUND ) );
listDevicesFound.setOnItemClickListener( new OnItemClickListener()
{
public void onItemClick(AdapterView<?> arg0, View arg1,int arg2, long arg3)
{
Log.i("Discovery: ", Integer.toString( myBtAdapter.getState() ) );
boolean success = myBtAdapter.cancelDiscovery();
myBtDevice = btDevicesFound.get( arg2 );
try {
btSocket = myBtDevice.createRfcommSocketToServiceRecord( MY_UUID );
iStream = btSocket.getInputStream();
oStream = btSocket.getOutputStream();
} catch ( IOException e ) {
Log.e( "Bluetooth Socket", "Bluetooth not available, or insufficient permissions" );
} catch ( NullPointerException e ) {
Log.e( "Bluetooth Socket", "Null Pointer One" );
}
CheckBlueToothState();
try {
btSocket.connect();
} catch ( IOException e ) {
Log.e( "Bluetooth Socket", "Problems arose while attempting to connect." );
} catch ( NullPointerException e ) {
Log.e( "Bluetooth Socket", "Null Pointer Two" );
}
}
});
}
private void CheckBlueToothState() {
if( myBtAdapter == null ) {
stateBluetooth.setText("Bluetooth NOT supported" );
} else {
if( myBtAdapter.isEnabled() ) {
if( myBtAdapter.isDiscovering() ) {
stateBluetooth.setText( "Bluetooth is currently " +
"in device discovery process." );
} else {
stateBluetooth.setText( "Bluetooth is Enabled." );
btnScanDevice.setEnabled( true );
}
} else {
stateBluetooth.setText( "Bluetooth is NOT enabled" );
Intent enableBtIntent = new Intent( BluetoothAdapter.ACTION_REQUEST_ENABLE );
startActivityForResult( enableBtIntent, REQUEST_ENABLE_BT );
}
}
}
private Button.OnClickListener btnScanDeviceOnClickListener = new Button.OnClickListener() {
public void onClick( View arg0 ) {
btArrayAdapter.clear();
myBtAdapter.startDiscovery();
}
};
@Override
protected void onActivityResult( int requestCode, int resultCode, Intent data ) {
if( requestCode == REQUEST_ENABLE_BT ) {
CheckBlueToothState();
}
}
private final BroadcastReceiver ActionFoundReceiver = new BroadcastReceiver() {
public void onReceive( Context context, Intent intent ) {
String action = intent.getAction();
if( BluetoothDevice.ACTION_FOUND.equals( action ) ) {
BluetoothDevice btDevice = intent.getParcelableExtra( BluetoothDevice.EXTRA_DEVICE );
btDevicesFound.add( btDevice );
btArrayAdapter.add( btDevice.getName() + "\n" + btDevice.getAddress() );
btArrayAdapter.notifyDataSetChanged();
}
}
};
public static void startBluetooth(){
try {
myBtAdapter = BluetoothAdapter.getDefaultAdapter();
myBtAdapter.enable();
} catch ( NullPointerException ex ) {
Log.e( "Bluetooth", "Device not available" );
}
}
public static void stopBluetooth() {
myBtAdapter.disable();
}
}