2015-06-23 63 views
1

我的應用程序列出了在藍牙LE設備上找到的服務。它具有:某些設備上沒有藍牙gatt回調

  • 服務(BluetoothLeService.java),處理gattcallbacks和廣播更新

  • 了在主要活動

聲明的廣播接收器,我不能可靠地獲得關貿總協定來自BluetoothGatt在我的廣播接收器中的回調。我有兩個設備正在測試,他們得到不同的結果,爲相同的代碼。運行Android 4.4.2的我的平板電腦完全沒有回撥,而運行5.1.1的Nexus 4手機獲取回叫並顯示服務。

這裏是我的關貿總協定回調從我的服務中:

private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { 
    @Override 
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { 
     String intentAction; 
     if (newState == BluetoothProfile.STATE_CONNECTED) { 
      intentAction = ACTION_GATT_CONNECTED; 
      mConnectionState = STATE_CONNECTED; 
      broadcastUpdate(intentAction); 
      Log.i(TAG, "Connected to GATT server."); 
      // Attempts to discover services after successful connection. 
      Log.i(TAG, "Attempting to start service discovery."); 
        //mBluetoothGatt.discoverServices(); 
        gatt.discoverServices(); 
     } else if (newState == BluetoothProfile.STATE_DISCONNECTED) { 
      intentAction = ACTION_GATT_DISCONNECTED; 
      mConnectionState = STATE_DISCONNECTED; 
      Log.i(TAG, "Disconnected from GATT server."); 
      broadcastUpdate(intentAction); 
     } 
    } 

    @Override 
    public void onServicesDiscovered(BluetoothGatt gatt, int status) { 

     if (status == BluetoothGatt.GATT_SUCCESS) { 
      broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED); 
      Log.d(TAG, "Services discovered, broadcasting update"); 
     } else { 
      Log.w(TAG, "onServicesDiscovered received: " + status); 
     } 
    } 

    @Override 
    public void onCharacteristicRead(BluetoothGatt gatt, 
            BluetoothGattCharacteristic characteristic, 
            int status) { 
     if (status == BluetoothGatt.GATT_SUCCESS) { 
      broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic); 
     } 
    } 

    @Override 
    public void onCharacteristicChanged(BluetoothGatt gatt, 
             BluetoothGattCharacteristic characteristic) { 
     broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic); 
     Log.d(TAG, "Characteristic changed, broadcasting update"); 


    } 

    @Override 
    public void onCharacteristicWrite(BluetoothGatt gatt, 
             BluetoothGattCharacteristic characteristic, 
             int status) { 
     broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic); 
     Log.d(TAG, "Characteristic written, braodcasting update"); 
    } 
}; 

這裏是我在我的主要活動:

// Code to manage Service lifecycle. 
private final ServiceConnection mServiceConnection = new ServiceConnection() { 

    @Override 
    public void onServiceConnected(ComponentName componentName, IBinder service) { 
     mBluetoothLeService = ((BluetoothLeService.LocalBinder) service).getService(); 
     if (!mBluetoothLeService.initialize()) { 
      Log.e(TAG, "Unable to initialize Bluetooth"); 
      finish(); 
     } 
     // Automatically connects to the device upon successful start-up initialization. 
     mBluetoothLeService.connect(mDeviceAddress); 
    } 

    @Override 
    public void onServiceDisconnected(ComponentName componentName) { 
     Log.d(TAG,"Disconnected from service"); 
     mBluetoothLeService = null; 
    } 
}; 
// Handles various events fired by the Service. 
// ACTION_GATT_CONNECTED: connected to a GATT server. 
// ACTION_GATT_DISCONNECTED: disconnected from a GATT server. 
// ACTION_GATT_SERVICES_DISCOVERED: discovered GATT services. 
// ACTION_DATA_AVAILABLE: received data from the device. This can be a result of read 
//      or notification operations. 

private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 

     final String action = intent.getAction(); 
     Log.d(TAG,"Received data from broadcast receiver: "+ action); 

     if (BluetoothLeService.ACTION_GATT_CONNECTED.equals(action)) { 
      mConnected = true; 
      updateConnectionState(R.string.connected); 
      invalidateOptionsMenu(); 
     } else if (BluetoothLeService.ACTION_GATT_DISCONNECTED.equals(action)) { 
      Log.d(TAG,"Disconnected from the gatt server"); 
      mConnected = false; 
      updateConnectionState(R.string.disconnected); 
      invalidateOptionsMenu(); 
      clearUI(); 
     } else if (BluetoothDevice.ACTION_FOUND.equals(action)) { 
      Log.d(TAG,"Receiver: Action Found"); 
      // Get the BluetoothDevice object from the Intent 
      BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 

      // get fresh uuids 
      device.fetchUuidsWithSdp(); 

     } else if (BluetoothDevice.ACTION_UUID.equals(action)) { 
      // Get the device and teh uuids 
      BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
      Parcelable[] uuidExtra = intent.getParcelableArrayExtra(BluetoothDevice.EXTRA_UUID); 

      if (uuidExtra != null) { 

       for (Parcelable uuid : uuidExtra) { 
        Log.d(TAG, "Device: " + device.getName() + " (" + device.getAddress() + ") - Service: " + uuid.toString()); 
       } 

      } 
     } else if (BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED.equals(action)) { 
      // Show all the supported services and characteristics on the user interface. 
      myDevice.setServices(mBluetoothLeService.getSupportedGattServices()); 
      Log.d(TAG,"Services for "+ myDevice.getName() +" set by broadcast receiver"); 
      displayGattServices(mBluetoothLeService.getSupportedGattServices()); 
     } else if (BluetoothLeService.ACTION_DATA_AVAILABLE.equals(action)) { 

      displayData(intent.getStringExtra(BluetoothLeService.EXTRA_DATA)); 
      Log.d(TAG, "Display Data: " + intent.getStringExtra(BluetoothLeService.EXTRA_DATA)); 
     } 
    } 
}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_api); 

    final Intent intent = getIntent(); 

    final Context context = getApplicationContext(); 

    // Initializes a Bluetooth adapter. For API level 18 and above, get a reference to 
    // BluetoothAdapter through BluetoothManager. 
    final BluetoothManager bluetoothManager = 
      (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); 
    mBluetoothAdapter = bluetoothManager.getAdapter(); 


    //Intent gattServiceIntent = new Intent(context, BluetoothLeService.class); 
    //context.bindService(gattServiceIntent, mServiceConnection, Context.BIND_AUTO_CREATE); 
    Intent gattServiceIntent = new Intent(this, BluetoothLeService.class); 
    bindService(gattServiceIntent, mServiceConnection, BIND_AUTO_CREATE); 
... 
}); 

最後,我的時候會發生什麼有些日誌輸出沒有得到回調

D/BluetoothGatt﹕ connect() - device: 00:07:80:2D:D3:5C, auto: false 
D/BluetoothGatt﹕ registerApp() 
D/BluetoothGatt﹕ registerApp() - UUID=468b550a-c0e6-4c54-8437-bb83d07f9be8 
D/BluetoothGatt﹕ onClientRegistered() - status=0 clientIf=5 
D/VXHB﹕ Trying to create a new connection. 
D/BluetoothGatt﹕ onClientConnectionState() - status=133 clientIf=5 device=00:07:80:2D:D3:5C 
I/VXHB﹕ Connected to GATT server. 
I/VXHB﹕ Attempting to start service discovery. 
D/BluetoothGatt﹕ discoverServices() - device: 00:07:80:2D:D3:5C 
D/VXHB﹕ Received data from broadcast receiver: my.package.name.ACTION_GATT_CONNECTED 

正如你可以從logcat輸出看到ACTI的廣播ON_GATT_CONNECTED的作品和發現服務實際上是解僱,但我從來沒有得到回調。

任何線索如何解決這個問題?

回答

-2

有在我的代碼的東西在其他地方造成這一故障。恢復到較舊的提交併解決了問題。

+0

標籤作爲解決方案不是非常有用。你能解釋你如何解決? – HappyCactus

+0

請你指出這裏有什麼問題? – JBA

0

嘗試註冊在你的onCreate廣播接收機這樣:

IntentFilter filter = new IntentFilter(); 
filter.addAction(BluetoothLeService.ACTION_GATT_CONNECTED); 
filter.addAction(BluetoothLeService.ACTION_GATT_DISCONNECTED); 
filter.addAction(BluetoothDevice.ACTION_FOUND); 
filter.addAction(BluetoothDevice.ACTION_UUID); 
filter.addAction(BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED); 
filter.addAction(BluetoothLeService.ACTION_DATA_AVAILABLE); 

registerReceiver(mGattUpdateReceiver, filter); 
+0

謝謝,我確實沒有包括它在我的代碼(對不起)。 – Satchmo