2017-01-30 2 views
0

Я разрабатываю приложение для Android, которое включает в себя показ пользователю списка ближайших устройств Bluetooth и подключение к выбранному ими устройству. Я пытаюсь использовать сборщик устройства системы с поддержкой BLUETOOTH, как показано на этих постах:Получить информацию о устройстве Bluetooth с устройства Bluetooth для устройства Bluetooth

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

Android Bluetooth Device Picker Usage

Початкоотделитель устройства делает шоу, но я не могу узнать, какое устройство было выбран в моем код. Тост внутри onReceive не показывает, что говорит о том, что никакая трансляция не принимается.

Еще одна проблема, с которой я столкнулся, заключается в том, что если я попытаюсь запустить операцию выбора устройства внутри onRequestPermissionsResult, сборщик устройств вообще не появится, несмотря на то, что щелкнул «разрешить» в диалоговом окне разрешения запроса. Тост внутри тоже не отображается.

Вот код:

//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)); 

} 

Любая помощь будет оценена.

Примечание: Я проверил код на заметке Lenovo K3, работающей с Marshmallow.

ответ

0

Проблема была в DEVICE_PICKER_LAUNCH_CLASS, что было указано как Fragment1. Класс запуска должен быть активным, даже если широковещательный приемник находится внутри фрагмента. В этом случае изменение класса запуска до ControllerActivity (содержащего фрагмент Fragment1) устранило проблему.

Смежные вопросы