如何使用Android蓝牙设备选择器检索蓝牙设备信息?

时间:2012-01-03 12:33:00

标签: android bluetooth

以下是我正在使用的测试代码:

public class IOConnectDirect extends Activity {

private static final String TAG = "IOConnectDirect";

private static final int REQCODE_BLUETOOTH_RESULT = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.i(TAG, "onCreate");
    setTitle(getTitle() + "--" + TAG);
    Intent intentBluetooth = new Intent();
    intentBluetooth.setAction("android.bluetooth.devicepicker.action.LAUNCH");
    //android.bluetooth.devicepicker.action.DEVICE_SELECTED not working .
    startActivityForResult(intentBluetooth, REQCODE_BLUETOOTH_RESULT);
}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.i(TAG, "onActivityResult(" + requestCode  +"," + resultCode + ")");

    switch (requestCode) {
    case REQCODE_BLUETOOTH_RESULT:
        Log.i(TAG, "requestCode = REQCODE_BLUETOOTH_RESULT");

        if(resultCode == RESULT_OK) {
            Log.i(TAG, "RESULT_OK");

            // Retrieve the Info
            Bundle extras = data.getExtras();

            if(extras != null) {
                Log.i(TAG, "Bundle ok");
            }
        }
        else {
            Log.i(TAG, "!RESULT_OK = FAILED(" + resultCode + ")");
            Toast.makeText(this, "Failed(" + resultCode +")", Toast.LENGTH_SHORT).show();
        }

        break;

    default:
        Log.i(TAG, "requestCode = ????");
        break;
    }
}

}

这是Logcat输出:

I/IOConnectDirect(14956): onActivityResult(0,0)
I/IOConnectDirect(14956): requestCode = REQCODE_BLUETOOTH_RESULT
I/IOConnectDirect(14956): !RESULT_OK = FAILED(0)

代码有效(你需要先激活蓝牙),我无法让它做我想做的事情,即检索我从活动中选择的蓝牙设备名称和地址。

注意:

  • 我不想连接我只想要选择设备信息。
  • 我熟悉其他方法,例如Android蓝牙聊天示例

更新

我最终使用的是BroadcastReceiver

public class IOConnectDirect extends Activity {

    private static final String TAG = "IOConnectDirect";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i(TAG, "onCreate");

        BluetoothConnectActivityReceiver mBluetoothPickerReceiver = new BluetoothConnectActivityReceiver();
        registerReceiver(mBluetoothPickerReceiver, new IntentFilter(BluetoothDevicePicker.ACTION_DEVICE_SELECTED));
        startActivity(new Intent(BluetoothDevicePicker.ACTION_LAUNCH)
            .putExtra(BluetoothDevicePicker.EXTRA_NEED_AUTH, false)
        .putExtra(BluetoothDevicePicker.EXTRA_FILTER_TYPE, BluetoothDevicePicker.FILTER_TYPE_ALL)
        .setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS));

    }

    public class BluetoothConnectActivityReceiver extends BroadcastReceiver {


        @Override
        public void onReceive(Context context, Intent intent)  {
            if(BluetoothDevicePicker.ACTION_DEVICE_SELECTED.equals(intent.getAction())) {
                context.unregisterReceiver(this);
                BluetoothDevice device = (BluetoothDevice) intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                Toast.makeText(context, "device" + device.getAddress(), Toast.LENGTH_SHORT).show();
            }
        }
    }

2 个答案:

答案 0 :(得分:0)

试试这段代码:

private final BroadcastReceiver mBluetoothPickerReceiver = new BluetoothConnectActivityReceiver(this);

 void connectToService(String defaultAdapter) {
    if (defaultAdapter == null) {
        registerReceiver(mBluetoothPickerReceiver, new IntentFilter(BluetoothDevicePicker.ACTION_DEVICE_SELECTED));
        startActivity(new Intent(BluetoothDevicePicker.ACTION_LAUNCH)
            .putExtra(BluetoothDevicePicker.EXTRA_NEED_AUTH, false)
            .putExtra(BluetoothDevicePicker.EXTRA_FILTER_TYPE, BluetoothDevicePicker.FILTER_TYPE_ALL)
            .setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS));
    } else {
        mCardroid.getCardroidService().connectTo(defaultAdapter);
    }
}

public class BluetoothConnectActivityReceiver extends BroadcastReceiver {
    private BluetoothConnectActivity bluetoothConnectActivity;
 public BluetoothConnectActivityReceiver(BluetoothConnectActivity bluetoothConnectActivity) {
            this.bluetoothConnectActivity = bluetoothConnectActivity;
        }

     @Override
            public void onReceive(Context context, Intent intent)  {
                if(BluetoothDevicePicker.ACTION_DEVICE_SELECTED.equals(intent.getAction())) {
                    context.unregisterReceiver(this);
                    BluetoothDevice device = (BluetoothDevice) intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                    bluetoothConnectActivity.connectToService(device.getAddress());
                }
            }
        }

完整代码的参考是:

http://code.google.com/p/carbot/source/browse/trunk/src/net/cardroid/?r=8

答案 1 :(得分:0)

Try this code:  


private ArrayAdapter<String> bondedAdapter = null,newScanedAdapter = null;   


listViewPairedDevices.setAdapter(bondedAdapter);//oncreate
listViewScanedDevices.setAdapter(newScanedAdapter);//oncreate

public void doDiscovery(){
            setProgressBarIndeterminateVisibility(true);
            setTitle("Scanning..");
            textViewScanedDevices.setVisibility(View.VISIBLE);
            if(!BluetoothDemoActivity.bluetoothAdapter.isDiscovering()){
                BluetoothDemoActivity.bluetoothAdapter.cancelDiscovery();
            }
            BluetoothDemoActivity.bluetoothAdapter.startDiscovery();
        }//doDiscovery() ends


    IntentFilter intentFilter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
            this.registerReceiver(myBroadcastReceiver, intentFilter);

            intentFilter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
            this.registerReceiver(myBroadcastReceiver, intentFilter);

    Set<BluetoothDevice> bondedSet = BluetoothDemoActivity.bluetoothAdapter.getBondedDevices();
                Log.v(BluetoothDemoActivity.LOG, "BluetoothDemo : bondedSet: "+bondedSet);

                int count = 0;
                if(bondedSet.size() > 0){
                    for(BluetoothDevice device : bondedSet){
                        textViewPairedDevice.setVisibility(View.VISIBLE);
                        bondedAdapter.add(device.getName()+"\n"+device.getAddress());
                        Log.v(BluetoothDemoActivity.LOG, " count = "+count++);
                    }
                }else{
                    bondedAdapter.add("No Devices");
                }



    private BroadcastReceiver myBroadcastReceiver = new BroadcastReceiver() {

            @Override
            public void onReceive(Context context, Intent intent) {
                // TODO Auto-generated method stub
                String action = intent.getAction();

                if(BluetoothDevice.ACTION_FOUND.equals(action)){
                    buttonScanScanDevices.setVisibility(View.GONE);
                    BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                    if(device.getBondState()!= BluetoothDevice.BOND_BONDED){
                        newScanedAdapter.add(device.getName()+"\n"+device.getAddress());
                    }
                }else if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){
                    setProgressBarIndeterminateVisibility(false);
                    setTitle("Select Device");
                    if(newScanedAdapter.getCount() == 0){
                        newScanedAdapter.add("no new device");
                    }
                }else if(intent.getAction().equals("android.bluetooth.device.action.PAIRING_REQUEST")){
                    System.out.println("Pairing request came");
                    pair();
                }
            }
        };//BroadcastReceiverends