2017-07-19 213 views
0

我已經梳理論壇,以試圖找出爲什麼我的藍牙BroadcastReceiver不工作,我能找到的所有人都說,以確保粗略/罰款位置權限的要求。我已經在做,在這裏(方法的發現方法之前調用):Android藍牙BroadcastReceiver沒有發現設備

請求權限

private void requestPermissions() 
{ 
    final int CODE = 5; // app defined constant used for onRequestPermissionsResult 

    boolean allPermissionsGranted = true; 

    String[] permissionsToRequest = 
      { 
       Manifest.permission.BLUETOOTH_ADMIN, 
       Manifest.permission.BLUETOOTH, 
       Manifest.permission.ACCESS_FINE_LOCATION, 
       Manifest.permission.ACCESS_COARSE_LOCATION 
      }; 

    for(String permission : permissionsToRequest) 
    { 
     allPermissionsGranted = allPermissionsGranted && 
       (ContextCompat.checkSelfPermission(this, permission) 
         == PackageManager.PERMISSION_GRANTED); 
    } 

    if(!allPermissionsGranted) 
    { 
     ActivityCompat.requestPermissions(this, permissionsToRequest, CODE); 
    } 
} 

的問題是,我從來沒有廣播接收器等發現發現設備,如果設備已經配對,它按預期將它放入ListView中,但一旦設備未配對,就無法再識別它。見下面的截圖。

Output with no paired devices

Output with paired devices

我在在這一點上的損失,那感覺就像我用盡了一切辦法,如果任何人有任何想法,你會來救我的生命,我會永遠感激。

謝謝,

廣播接收機

private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     String action = intent.getAction(); 

     if(BluetoothDevice.ACTION_FOUND.equals(action)) 
     { 
      BluetoothDevice btDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 

      if(btDevice.getBondState() != BluetoothDevice.BOND_BONDED) 
      { 
       newDevicesArrayAdapter.add(btDevice.getName() + "\n" + btDevice.getAddress()); 
      } 
     } 
     else if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) 
     { 
      setTitle(R.string.select_device); 

      if(newDevicesArrayAdapter.getCount() == 0) 
      { 
       newDevicesArrayAdapter.clear(); 
       String noDevices = getResources().getText(R.string.none_found).toString(); 
       newDevicesArrayAdapter.add(noDevices); 
      } 
     } 
    } 
}; 

的onCreate - 設置的ListView元件和IntentFilters

protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_choose_machine); 

    setResult(Activity.RESULT_CANCELED); 

    pairedDevicesArrayAdapter = new ArrayAdapter<String>(this, R.layout.device_name); 
    newDevicesArrayAdapter  = new ArrayAdapter<String>(this, R.layout.device_name); 

    ListView pairedListView  = (ListView) findViewById(R.id.paired_devices); 
    ListView newDevicesListView = (ListView) findViewById(R.id.new_devices); 

    pairedListView.setAdapter(pairedDevicesArrayAdapter); 
    pairedListView.setOnItemClickListener(deviceClickListener); 
    newDevicesListView.setAdapter(pairedDevicesArrayAdapter); 
    newDevicesListView.setOnItemClickListener(deviceClickListener); 

    IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); 
    registerReceiver(broadcastReceiver, filter); 

    filter    = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); 
    registerReceiver(broadcastReceiver, filter); 
} 

doDiscovery() - 通過OnStart方法調用,我已經證實它得到了所謂的

private void doDiscovery() 
{ 
    Log.d(TAG, "doDiscovery()"); 

    requestPermissions(); 

    setTitle(R.string.scanning); 

    findViewById(R.id.title_new_devices).setVisibility(View.VISIBLE); 

    if(btAdapter.isDiscovering()) { btAdapter.cancelDiscovery(); } 

    newDevicesArrayAdapter.clear(); 
    btAdapter.startDiscovery(); 
} 

回答

0

原來我只是愚蠢,並有值更新到兩個ListViews,所以我從來沒有看到其他設備的列表。

pairedListView.setAdapter(pairedDevicesArrayAdapter); 
pairedListView.setOnItemClickListener(deviceClickListener); 
newDevicesListView.setAdapter(pairedDevicesArrayAdapter); 
newDevicesListView.setOnItemClickListener(deviceClickListener); 

本來應該是:

pairedListView.setAdapter(pairedDevicesArrayAdapter); 
pairedListView.setOnItemClickListener(deviceClickListener); 
newDevicesListView.setAdapter(newDevicesArrayAdapter); 
newDevicesListView.setOnItemClickListener(deviceClickListener);