2017-01-30 199 views
0

我正在開發一個Android應用程序,它涉及向用戶顯示附近的藍牙設備列表並連接到他們選擇的設備。我想用在這些職位中所示的系統的藍牙設備選擇器:從Android藍牙設備選取器獲取藍牙設備信息

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筆記上的代碼。

回答

0

問題出在DEVICE_PICKER_LAUNCH_CLASS,它被指定爲Fragment1。即使廣播接收器位於片段內,啓動類也必須是活動。在這種情況下,將啓動類更改爲ControllerActivity(其中包含片段Fragment1)可以解決問題。