简体   繁体   中英

Get Bluetooth device information from the Android bluetooth device picker

I am developing an Android application which involves showing the user a list of nearby Bluetooth devices and connecting to the device selected by them. I'm trying to use the system bluetooth device picker as shown in these posts:

How to retrieve Bluetooth device info with Android Bluetooth device picker?

Android Bluetooth Device Picker Usage

The device picker does show, but I can't find out which device was selected in my code. The toast inside the onReceive does not show, which suggests that no broadcast is being received.

Another problem I faced is that if I try to start the device picker activity inside the onRequestPermissionsResult , the device picker does not show up at all, despite clicking 'allow' in the request permission dialog. The toast inside doesn't get displayed either.

Here's the code:

//Code inside Fragment
BroadcastReceiver mReceiver;
BluetoothAdapter bluetoothAdapter;
BluetoothSocket bsock;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    myView = inflater.inflate(R.layout.controller_mode_layout,container,false);

     bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
//Get location access permission.
    if (bluetoothAdapter != null) {
        if (bluetoothAdapter.isEnabled()) {
            ActivityCompat.requestPermissions(getActivity(),new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, reqCode);
        }
    }
//Receiver to get the selected device information 
    mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
                context.unregisterReceiver(this);
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            Toast.makeText(context,"Device"+device.getAddress(), Toast.LENGTH_SHORT).show();
            try {
                bsock=device.createRfcommSocketToServiceRecord(UUID.fromString("00002415-0000-1000-8000-00805F9B34FB"));
                bsock.connect();
                //Send and receive data logic follows

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    };
    getActivity().registerReceiver(mReceiver, new IntentFilter("android.bluetooth.devicepicker.action.DEVICE_SELECTED"));

    showDevicePicker();

    return myView;
}



@Override
public void onRequestPermissionsResult (int requestCode, String[] permissions, int[] grantResults)
{
    Toast.makeText(getActivity(),"Permission result", Toast.LENGTH_SHORT).show();
    if((requestCode == reqCode) && (grantResults[0] == PackageManager.PERMISSION_GRANTED))
    {
        //Not working
       // showDevicePicker();
    }
}

public void showDevicePicker()
{
    //Launch built in bluetooth device picker activity
    startActivity( new Intent("android.bluetooth.devicepicker.action.LAUNCH")
            .putExtra("android.bluetooth.devicepicker.extra.NEED_AUTH", false)
            .putExtra("android.bluetooth.devicepicker.extra.FILTER_TYPE", 0)
            .putExtra("android.bluetooth.devicepicker.extra.LAUNCH_PACKAGE","com.example.ankit2.controllerapp1")
            .putExtra("android.bluetooth.devicepicker.extra.DEVICE_PICKER_LAUNCH_CLASS","com.example.ankit2.controllerapp1.Fragment1")
            .setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS));

}

Any help will be appreciated.

Note: I tested the code on a Lenovo K3 note running Marshmallow.

The problem was in the DEVICE_PICKER_LAUNCH_CLASS , which was specified as Fragment1 . The launch class must be an activity, even if the broadcast receiver is inside a fragment. In this case, changing the launch class to ControllerActivity (which contains the fragment Fragment1 ) fixed the problem.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM