如何在android中获取可撤销的通知?

如何在android中获取可撤销的通知?,android,bluetooth-lowenergy,android-bluetooth,Android,Bluetooth Lowenergy,Android Bluetooth,我正在尝试获取自定义设备的通知。我知道该设备正在工作,因为在使用Lightblue应用程序的iOS中,我确实收到了通知。我试过Nexus5和三星s4(都是Kitkat)。似乎什么都不管用。我的“onCharacteristicChanged”没有被调用 MainActivity.java package com.foo.ble; import android.app.Activity; import android.bluetooth.BluetoothAdapter; import andr

我正在尝试获取自定义设备的通知。我知道该设备正在工作,因为在使用Lightblue应用程序的iOS中,我确实收到了通知。我试过Nexus5和三星s4(都是Kitkat)。似乎什么都不管用。我的“onCharacteristicChanged”没有被调用

MainActivity.java

package com.foo.ble;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothManager;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;


public class MainActivity extends Activity implements BluetoothAdapter.LeScanCallback {
    private BluetoothAdapter adapter;

    final private static char[] hexArray = "0123456789ABCDEF".toCharArray();
    private Callback callback;

    /**
     * Converts 0xfe to "FE"
     * @return hex representation of the adScanned
     */
    public static String getPayload(final byte[] adScanned) {
        if (adScanned == null) return "N/A";

        final char[] hexChars = new char[adScanned.length * 2];
        for (int j = 0; j < adScanned.length; j++) {
            final int v = adScanned[j] & 0xFF;
            hexChars[j * 2] = hexArray[v >>> 4];
            hexChars[j * 2 + 1] = hexArray[v & 0x0F];
        }
        return new String(hexChars);
    }

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

        BluetoothManager manager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
        adapter = manager.getAdapter();
        callback = new Callback();

        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                adapter.stopLeScan(MainActivity.this);
            }
        }, 3*10000);

        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                adapter.startLeScan(MainActivity.this);
            }
        });
    }

    @Override
    public void onLeScan(final BluetoothDevice device, final int rssi, final byte[] scanRecord) {
        if (device.getAddress().equals("CE:AD:09:F2:BB:DC")) {
            Log.d("foo", "onLeScan payload:" + getPayload(scanRecord));
            adapter.stopLeScan(this);
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    device.connectGatt(MainActivity.this, true, callback);
                }
            });
        }
    }

    @Override
    protected void onDestroy() {
        callback.close();
    }
}
My AndroidManifest.xml具有:

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

日志如下所示:

11-05 12:17:13.314    3683-3683/com.foo.ble D/BluetoothAdapter﹕ startLeScan(): null
11-05 12:17:13.364    3683-3695/com.foo.ble D/BluetoothAdapter﹕ onClientRegistered() - status=0 clientIf=5
11-05 12:17:13.394    3683-3683/com.foo.ble I/Adreno-EGL﹕ <qeglDrvAPI_eglInitialize:320>: EGL 1.4 QUALCOMM Build: I0404c4692afb8623f95c43aeb6d5e13ed4b30ddbDate: 11/06/13
11-05 12:17:13.414    3683-3683/com.foo.ble D/OpenGLRenderer﹕ Enabling debug mode 0
11-05 12:17:13.454    3683-3683/com.foo.ble D/dalvikvm﹕ GC_FOR_ALLOC freed 238K, 2% free 16971K/17240K, paused 14ms, total 14ms
11-05 12:17:15.174    3683-3694/com.foo.ble D/foo﹕ onLeScan payload:02010517FF0000000000000005000000000000000000395401001207086C6976656C7911072E9AB04DB9790F857A4CF0634C7AB94A000000000000000000
11-05 12:17:15.174    3683-3694/com.foo.ble D/BluetoothAdapter﹕ stopLeScan()
11-05 12:17:15.184    3683-3683/com.foo.ble D/BluetoothGatt﹕ connect() - device: CE:AD:09:F2:BB:DC, auto: true
11-05 12:17:15.184    3683-3683/com.foo.ble D/BluetoothGatt﹕ registerApp()
11-05 12:17:15.184    3683-3683/com.foo.ble D/BluetoothGatt﹕ registerApp() - UUID=605cbd6f-6080-4fd8-97ff-1f97b406258e
11-05 12:17:15.194    3683-3695/com.foo.ble D/BluetoothGatt﹕ onClientRegistered() - status=0 clientIf=5
11-05 12:17:43.344    3683-3683/com.foo.ble D/BluetoothAdapter﹕ stopLeScan()
11-05 12:23:59.194    3683-3694/com.foo.ble D/BluetoothGatt﹕ onClientConnectionState() - status=0 clientIf=5 device=CE:AD:09:F2:BB:DC
11-05 12:23:59.194    3683-3694/com.foo.ble D/foo﹕ onConnectionStateChange
11-05 12:23:59.204    3683-3694/com.foo.ble D/foo﹕ status connected
11-05 12:23:59.204    3683-3694/com.foo.ble D/BluetoothGatt﹕ discoverServices() - device: CE:AD:09:F2:BB:DC
11-05 12:24:00.754    3683-3695/com.foo.ble D/BluetoothGatt﹕ onGetService() - Device=CE:AD:09:F2:BB:DC UUID=randomService1
11-05 12:24:00.764    3683-3694/com.foo.ble D/BluetoothGatt﹕ onGetService() - Device=CE:AD:09:F2:BB:DC UUID=randomService2
11-05 12:24:00.784    3683-3695/com.foo.ble D/BluetoothGatt﹕ onGetService() - Device=CE:AD:09:F2:BB:DC UUID=something1
11-05 12:24:00.794    3683-3694/com.foo.ble D/BluetoothGatt﹕ onGetCharacteristic() - Device=CE:AD:09:F2:BB:DC UUID=randomUUID1
11-05 12:24:00.804    3683-3695/com.foo.ble D/BluetoothGatt﹕ onGetCharacteristic() - Device=CE:AD:09:F2:BB:DC UUID=randomUUID2
11-05 12:24:00.804    3683-3694/com.foo.ble D/BluetoothGatt﹕ onGetCharacteristic() - Device=CE:AD:09:F2:BB:DC UUID=randomUUID3
11-05 12:24:00.814    3683-3695/com.foo.ble D/BluetoothGatt﹕ onGetCharacteristic() - Device=CE:AD:09:F2:BB:DC UUID=randomUUID4
11-05 12:24:00.814    3683-3694/com.foo.ble D/BluetoothGatt﹕ onGetCharacteristic() - Device=CE:AD:09:F2:BB:DC UUID=randomUUID5
11-05 12:24:00.814    3683-3695/com.foo.ble D/BluetoothGatt﹕ onGetCharacteristic() - Device=CE:AD:09:F2:BB:DC UUID=randomUUID6
11-05 12:24:00.814    3683-3694/com.foo.ble D/BluetoothGatt﹕ onGetCharacteristic() - Device=CE:AD:09:F2:BB:DC UUID=randomUUID7
11-05 12:24:00.814    3683-3695/com.foo.ble D/BluetoothGatt﹕ onGetCharacteristic() - Device=CE:AD:09:F2:BB:DC UUID=something2
11-05 12:24:00.824    3683-3694/com.foo.ble D/BluetoothGatt﹕ onGetDescriptor() - Device=CE:AD:09:F2:BB:DC UUID=something3
11-05 12:24:00.824    3683-3695/com.foo.ble D/BluetoothGatt﹕ onSearchComplete() = Device=CE:AD:09:F2:BB:DC Status=0
11-05 12:24:00.824    3683-3695/com.foo.ble D/foo﹕ onServicesDiscovered
11-05 12:24:00.824    3683-3695/com.foo.ble D/BluetoothGatt﹕ setCharacteristicNotification() - uuid: something2 enable: true
11-05 12:24:00.834    3683-3695/com.foo.ble D/BluetoothGatt﹕ writeDescriptor() - uuid: something3
11-05 12:24:00.894    3683-3694/com.foo.ble D/BluetoothGatt﹕ onDescriptorWrite() - Device=CE:AD:09:F2:BB:DC UUID=something3
11-05 12:24:00.894    3683-3694/com.foo.ble D/foo﹕ onDescriptorWrite status: 0
11-05 12:24:00.894    3683-3694/com.foo.ble D/BluetoothGatt﹕ readCharacteristic() - uuid: something2
11-05 12:24:00.994    3683-3695/com.foo.ble D/BluetoothGatt﹕ onCharacteristicRead() - Device=CE:AD:09:F2:BB:DC UUID=something2 Status=0
11-05 12:24:00.994    3683-3695/com.foo.ble D/foo﹕ onCharacteristicRead status:0 payload: 0000000000050000000000000000005154010012
11-05 12:17:13.314 3683-3683/com.foo.ble D/BluetoothAdapter﹕ startedscan():null
11-05 12:17:13.364 3683-3695/com.foo.ble D/BluetoothAdapter﹕ onClientRegistered()-状态=0 clientIf=5
11-05 12:17:13.3943683-3683/com.foo.ble I/Adreno EGL﹕ : EGL 1.4高通公司版本:I0404C4692AFB8623F95C43AEB6D5E13ED4B30DDB日期:2013年6月11日
11-05 12:17:13.4143683-3683/com.foo.bled D/opengld﹕ 正在启用调试模式0
11-05 12:17:13.4543683-3683/com.foo.ble D/dalvikvm﹕ 所有释放238K的GC_,2%释放16971K/17240K,暂停14ms,总计14ms
11-05 12:17:15.174 3683-3694/com.foo.ble D/foo﹕ 仅扫描有效载荷:02010517FF0000000000000005000000000000395401001207086C6976656C7911072E9AB04DB9790F857A4CF0634C7AB94A000000000000000000
11-05 12:17:15.174 3683-3694/com.foo.ble D/BluetoothAdapter﹕ stopLeScan()
11-05 12:17:15.184 3683-3683/com.foo.ble D/BluetoothGatt﹕ connect()-设备:CE:AD:09:F2:BB:DC,自动:真
11-05 12:17:15.184 3683-3683/com.foo.ble D/BluetoothGatt﹕ registerApp()
11-05 12:17:15.184 3683-3683/com.foo.ble D/BluetoothGatt﹕ registerApp()-UUID=605cbd6f-6080-4fd8-97ff-1f97b406258e
11-05 12:17:15.194 3683-3695/com.foo.ble D/BluetoothGatt﹕ onClientRegistered()-状态=0 clientIf=5
11-05 12:17:43.344 3683-3683/com.foo.ble D/BluetoothAdapter﹕ stopLeScan()
11-05 12:23:59.194 3683-3694/com.foo.ble D/BluetoothGatt﹕ onClientConnectionState()-status=0 clientIf=5 device=CE:AD:09:F2:BB:DC
11-05 12:23:59.194 3683-3694/com.foo.ble D/foo﹕ onConnectionStateChange
11-05 12:23:59.204 3683-3694/com.foo.ble D/foo﹕ 连接状态
11-05 12:23:59.204 3683-3694/com.foo.ble D/BluetoothGatt﹕ discoverServices()-设备:CE:AD:09:F2:BB:DC
11-05 12:24:00.7543683-3695/com.foo.ble D/BluetoothGatt﹕ onGetService()-Device=CE:AD:09:F2:BB:DC UUID=randomService1
11-05 12:24:00.764 3683-3694/com.foo.ble D/BluetoothGatt﹕ onGetService()-Device=CE:AD:09:F2:BB:DC UUID=randomService2
11-05 12:24:00.784 3683-3695/com.foo.ble D/BluetoothGatt﹕ onGetService()-Device=CE:AD:09:F2:BB:DC UUID=something1
11-05 12:24:00.794 3683-3694/com.foo.ble D/BluetoothGatt﹕ onGetCharacteristic()-Device=CE:AD:09:F2:BB:DC UUID=randomUUID1
11-05 12:24:00.804 3683-3695/com.foo.ble D/BluetoothGatt﹕ onGetCharacteristic()-Device=CE:AD:09:F2:BB:DC UUID=randomUUID2
11-05 12:24:00.804 3683-3694/com.foo.ble D/BluetoothGatt﹕ onGetCharacteristic()-Device=CE:AD:09:F2:BB:DC UUID=randomUUID3
11-05 12:24:00.8143683-3695/com.foo.ble D/BluetoothGatt﹕ onGetCharacteristic()-Device=CE:AD:09:F2:BB:DC UUID=randomUUID4
11-05 12:24:00.8143683-3694/com.foo.ble D/BluetoothGatt﹕ onGetCharacteristic()-Device=CE:AD:09:F2:BB:DC UUID=randomUUID5
11-05 12:24:00.8143683-3695/com.foo.ble D/BluetoothGatt﹕ onGetCharacteristic()-Device=CE:AD:09:F2:BB:DC UUID=randomUUID6
11-05 12:24:00.8143683-3694/com.foo.ble D/BluetoothGatt﹕ onGetCharacteristic()-Device=CE:AD:09:F2:BB:DC UUID=randomUUID7
11-05 12:24:00.8143683-3695/com.foo.ble D/BluetoothGatt﹕ onGetCharacteristic()-Device=CE:AD:09:F2:BB:DC UUID=something2
11-05 12:24:00.824 3683-3694/com.foo.ble D/BluetoothGatt﹕ onGetDescriptor()-Device=CE:AD:09:F2:BB:DC UUID=something3
11-05 12:24:00.824 3683-3695/com.foo.ble D/BluetoothGatt﹕ onSearchComplete()=设备=CE:AD:09:F2:BB:DC状态=0
11-05 12:24:00.824 3683-3695/com.foo.ble D/foo﹕ OnService发现
11-05 12:24:00.824 3683-3695/com.foo.ble D/BluetoothGatt﹕ setCharacteristicNotification()-uuid:something2启用:true
11-05 12:24:00.834 3683-3695/com.foo.ble D/BluetoothGatt﹕ writeDescriptor()-uuid:something3
11-05 12:24:00.894 3683-3694/com.foo.ble D/BluetoothGatt﹕ onDescriptorWrite()-Device=CE:AD:09:F2:BB:DC UUID=something3
11-05 12:24:00.894 3683-3694/com.foo.ble D/foo﹕ onDescriptorWrite状态:0
11-05 12:24:00.894 3683-3694/com.foo.ble D/BluetoothGatt﹕ readCharacteristic()-uuid:something2
11-05 12:24:00.994 3683-3695/com.foo.ble D/BluetoothGatt﹕ onCharacteristicRead()-Device=CE:AD:09:F2:BB:DC UUID=something2状态=0
11-05 12:24:00.994 3683-3695/com.foo.ble D/foo﹕ onCharacteristicRead状态:0有效负载:000000000000000000005154010012

任何帮助都将不胜感激

我观察到通知要么不能与某些电话/外围设备/环境组合一起工作,要么在同一连接会话中工作后停止工作,没有明显的原因。所有呼叫都返回成功,但通知无法通过。不管你是否解决了眼前的问题,你应该考虑为你的特征值做一个读取投票作为备份解决方案。
onServicesDiscovery()
方法中的各种调用也应该通过对所调用的各种gatt方法的返回值进行条件检查来进行选通

无论如何,有些事情你可以试试:

  • 尝试通过手机设置重置蓝牙协议栈,甚至重新启动整个手机
  • 测试其他设备。iOS上有一些应用程序可以让你的iPhone充当外设。尝试连接到这样的“sim设备”,看看在这种情况下通知是否有效
  • 试试不同的安卓手机。我观察到,如果你使用的是Nexus4,那么它的通知问题最多
最后,我会像技术支持人员一样询问计算机是否已插入:确保外围设备上的特征值确实在变化。

什么
11-05 12:17:13.314    3683-3683/com.foo.ble D/BluetoothAdapter﹕ startLeScan(): null
11-05 12:17:13.364    3683-3695/com.foo.ble D/BluetoothAdapter﹕ onClientRegistered() - status=0 clientIf=5
11-05 12:17:13.394    3683-3683/com.foo.ble I/Adreno-EGL﹕ <qeglDrvAPI_eglInitialize:320>: EGL 1.4 QUALCOMM Build: I0404c4692afb8623f95c43aeb6d5e13ed4b30ddbDate: 11/06/13
11-05 12:17:13.414    3683-3683/com.foo.ble D/OpenGLRenderer﹕ Enabling debug mode 0
11-05 12:17:13.454    3683-3683/com.foo.ble D/dalvikvm﹕ GC_FOR_ALLOC freed 238K, 2% free 16971K/17240K, paused 14ms, total 14ms
11-05 12:17:15.174    3683-3694/com.foo.ble D/foo﹕ onLeScan payload:02010517FF0000000000000005000000000000000000395401001207086C6976656C7911072E9AB04DB9790F857A4CF0634C7AB94A000000000000000000
11-05 12:17:15.174    3683-3694/com.foo.ble D/BluetoothAdapter﹕ stopLeScan()
11-05 12:17:15.184    3683-3683/com.foo.ble D/BluetoothGatt﹕ connect() - device: CE:AD:09:F2:BB:DC, auto: true
11-05 12:17:15.184    3683-3683/com.foo.ble D/BluetoothGatt﹕ registerApp()
11-05 12:17:15.184    3683-3683/com.foo.ble D/BluetoothGatt﹕ registerApp() - UUID=605cbd6f-6080-4fd8-97ff-1f97b406258e
11-05 12:17:15.194    3683-3695/com.foo.ble D/BluetoothGatt﹕ onClientRegistered() - status=0 clientIf=5
11-05 12:17:43.344    3683-3683/com.foo.ble D/BluetoothAdapter﹕ stopLeScan()
11-05 12:23:59.194    3683-3694/com.foo.ble D/BluetoothGatt﹕ onClientConnectionState() - status=0 clientIf=5 device=CE:AD:09:F2:BB:DC
11-05 12:23:59.194    3683-3694/com.foo.ble D/foo﹕ onConnectionStateChange
11-05 12:23:59.204    3683-3694/com.foo.ble D/foo﹕ status connected
11-05 12:23:59.204    3683-3694/com.foo.ble D/BluetoothGatt﹕ discoverServices() - device: CE:AD:09:F2:BB:DC
11-05 12:24:00.754    3683-3695/com.foo.ble D/BluetoothGatt﹕ onGetService() - Device=CE:AD:09:F2:BB:DC UUID=randomService1
11-05 12:24:00.764    3683-3694/com.foo.ble D/BluetoothGatt﹕ onGetService() - Device=CE:AD:09:F2:BB:DC UUID=randomService2
11-05 12:24:00.784    3683-3695/com.foo.ble D/BluetoothGatt﹕ onGetService() - Device=CE:AD:09:F2:BB:DC UUID=something1
11-05 12:24:00.794    3683-3694/com.foo.ble D/BluetoothGatt﹕ onGetCharacteristic() - Device=CE:AD:09:F2:BB:DC UUID=randomUUID1
11-05 12:24:00.804    3683-3695/com.foo.ble D/BluetoothGatt﹕ onGetCharacteristic() - Device=CE:AD:09:F2:BB:DC UUID=randomUUID2
11-05 12:24:00.804    3683-3694/com.foo.ble D/BluetoothGatt﹕ onGetCharacteristic() - Device=CE:AD:09:F2:BB:DC UUID=randomUUID3
11-05 12:24:00.814    3683-3695/com.foo.ble D/BluetoothGatt﹕ onGetCharacteristic() - Device=CE:AD:09:F2:BB:DC UUID=randomUUID4
11-05 12:24:00.814    3683-3694/com.foo.ble D/BluetoothGatt﹕ onGetCharacteristic() - Device=CE:AD:09:F2:BB:DC UUID=randomUUID5
11-05 12:24:00.814    3683-3695/com.foo.ble D/BluetoothGatt﹕ onGetCharacteristic() - Device=CE:AD:09:F2:BB:DC UUID=randomUUID6
11-05 12:24:00.814    3683-3694/com.foo.ble D/BluetoothGatt﹕ onGetCharacteristic() - Device=CE:AD:09:F2:BB:DC UUID=randomUUID7
11-05 12:24:00.814    3683-3695/com.foo.ble D/BluetoothGatt﹕ onGetCharacteristic() - Device=CE:AD:09:F2:BB:DC UUID=something2
11-05 12:24:00.824    3683-3694/com.foo.ble D/BluetoothGatt﹕ onGetDescriptor() - Device=CE:AD:09:F2:BB:DC UUID=something3
11-05 12:24:00.824    3683-3695/com.foo.ble D/BluetoothGatt﹕ onSearchComplete() = Device=CE:AD:09:F2:BB:DC Status=0
11-05 12:24:00.824    3683-3695/com.foo.ble D/foo﹕ onServicesDiscovered
11-05 12:24:00.824    3683-3695/com.foo.ble D/BluetoothGatt﹕ setCharacteristicNotification() - uuid: something2 enable: true
11-05 12:24:00.834    3683-3695/com.foo.ble D/BluetoothGatt﹕ writeDescriptor() - uuid: something3
11-05 12:24:00.894    3683-3694/com.foo.ble D/BluetoothGatt﹕ onDescriptorWrite() - Device=CE:AD:09:F2:BB:DC UUID=something3
11-05 12:24:00.894    3683-3694/com.foo.ble D/foo﹕ onDescriptorWrite status: 0
11-05 12:24:00.894    3683-3694/com.foo.ble D/BluetoothGatt﹕ readCharacteristic() - uuid: something2
11-05 12:24:00.994    3683-3695/com.foo.ble D/BluetoothGatt﹕ onCharacteristicRead() - Device=CE:AD:09:F2:BB:DC UUID=something2 Status=0
11-05 12:24:00.994    3683-3695/com.foo.ble D/foo﹕ onCharacteristicRead status:0 payload: 0000000000050000000000000000005154010012