bluetooth androidでdisconnectが呼ばれた際に、notifyCharacteristicChangedを呼ぶとnullpointerで落ちる

今一つ苦しんでいる問題です。

発生の流れとしては、以下の通りになります。

1.peripheralにつないでいる、central端末がdiscconectになって、callbackのonConnectionStateChangedの
DISCONNECTが呼ばれる

2.peripehral端末で一定間隔で実行されている、notifyCharacteristicChangedが呼ばれる。

3.エラーが起きる

エラーログは以下になります。

01-20 18:25:32.010 5983-5997/com.jiji.everybody D/org.cocos2dx.cpp.AppActivity: call onConnectionStateChange STATE_DISCONNECTED
01-20 18:25:32.030 5983-6446/com.jiji.everybody E/AndroidRuntime: FATAL EXCEPTION: Timer-7
    Process: com.jiji.everybody, PID: 5983
    java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Integer.intValue()' on a null object reference
        at android.os.Parcel.readException(Parcel.java:1968)
        at android.os.Parcel.readException(Parcel.java:1898)
        at android.bluetooth.IBluetoothGatt$Stub$Proxy.sendNotification(IBluetoothGatt.java:1827)
        at android.bluetooth.BluetoothGattServer.notifyCharacteristicChanged(BluetoothGattServer.java:661)
        at org.cocos2dx.cpp.AppActivity.notifyConnectedDevice(AppActivity.java:517)
        at org.cocos2dx.cpp.AppActivity.access$600(AppActivity.java:52)
        at org.cocos2dx.cpp.AppActivity$PeripheralDataTimerTask.run(AppActivity.java:142)
        at java.util.TimerThread.mainLoop(Timer.java:555)
        at java.util.TimerThread.run(Timer.java:505)
01-20 18:25:32.070 5983-5983/com.jiji.everybody D/BluetoothGatt

中をみると、sendNotificationの中で、なにかにアクセスして、それがnullで落ちていることがわかります。

そして、notifyCharacteriscicChangedを呼んでいる箇所は以下になります。

String sendValue = getDeviceJsonData();
        // 端末に一斉送信する
        for (Map.Entry<String, CentralDeviceData> entry : connectedCentralDevices.entrySet()) {
            // まだ送っていない端末は、uuidを送る、menuScene以外では、すでに接続しているため、送らない
            if (!entry.getValue().getIsSend() && getSelectGame() == NON_SELECT) {
                mStrReceivedNum = entry.getKey();
                entry.getValue().setIsSend(true);
            } else {
                mStrReceivedNum = sendValue;
            }
            // 接続されているか確認する
            final int state = mBleManager.getConnectionState(entry.getValue().getDevice(),BluetoothProfile.GATT);

            if(state == BluetoothProfile.STATE_CONNECTED) {
                Log.d(TAG, "call notifyConnectedDevice json string = " + mStrReceivedNum);
                peripheralCharacteristic.setValue(mStrReceivedNum);
                if (!mBtGattServer.notifyCharacteristicChanged(entry.getValue().getDevice(), peripheralCharacteristic, true)) {
                    Log.d(TAG, "notifyCharacteristicChanged failed value = " + mStrReceivedNum);
                    resetSendStatus(SAME_VALUE,0,true);
                }
            }
        }

この関数を見ると、接続されていない端末に信号を送っているだけじゃないか?
と思うと思うんですが、disconnectが呼ばれた際に対象の端末は保持しているリストの中から外しているし、
なにより、送ろうとしている端末が接続されているかどうかをgetConnectionState関数を使って調べているのに、
なぜ落ちるのか、全くわかっていません。

誰かわかったら教えてください。

 

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です