writeCharacteristic failed

現(xiàn)象描述

調(diào)用 readCharacteristic 或者 writeCharacteristic 出現(xiàn)permission check failed! 時(shí), 后面便一直無法讀寫 characteristic了状共。

原因分析

調(diào)用readCharacteristic方法后mDeviceBusy被設(shè)置為true

/**
     * Reads the requested characteristic from the associated remote device.
     *
     * <p>This is an asynchronous operation. The result of the read operation
     * is reported by the {@link BluetoothGattCallback#onCharacteristicRead}
     * callback.
     *
     * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.
     *
     * @param characteristic Characteristic to read from the remote device
     * @return true, if the read operation was initiated successfully
     */
    public boolean readCharacteristic(BluetoothGattCharacteristic characteristic) {
        if ((characteristic.getProperties() & BluetoothGattCharacteristic.PROPERTY_READ) == 0) {
            return false;
        }

        if (VDBG) Log.d(TAG, "readCharacteristic() - uuid: " + characteristic.getUuid());
        if (mService == null || mClientIf == 0) return false;

        BluetoothGattService service = characteristic.getService();
        if (service == null) return false;

        BluetoothDevice device = service.getDevice();
        if (device == null) return false;

        synchronized (mDeviceBusyLock) {
            if (mDeviceBusy) return false;
            mDeviceBusy = true;
        }

        try {
            mService.readCharacteristic(mClientIf, device.getAddress(),
                    characteristic.getInstanceId(), AUTHENTICATION_NONE);
        } catch (RemoteException e) {
            Log.e(TAG, "", e);
            mDeviceBusy = false;
            return false;
        }

        return true;
    }

正常情況盗蟆,成功發(fā)完數(shù)據(jù)后會有onCharacteristicWrite返回塘娶,并將mDeviceBusy設(shè)置成false鸥滨。

/**
                 * Characteristic has been written to the remote device.
                 * Let the app know how we did...
                 * @hide
                 */
                @Override
                public void onCharacteristicWrite(String address, int status, int handle) {
                    if (VDBG) {
                        Log.d(TAG, "onCharacteristicWrite() - Device=" + address
                                + " handle=" + handle + " Status=" + status);
                    }

                    if (!address.equals(mDevice.getAddress())) {
                        return;
                    }

                    synchronized (mDeviceBusyLock) {
                        mDeviceBusy = false;
                    }

                    BluetoothGattCharacteristic characteristic = getCharacteristicById(mDevice,
                            handle);
                    if (characteristic == null) return;

                    if ((status == GATT_INSUFFICIENT_AUTHENTICATION
                            || status == GATT_INSUFFICIENT_ENCRYPTION)
                            && (mAuthRetryState != AUTH_RETRY_STATE_MITM)) {
                        try {
                            final int authReq = (mAuthRetryState == AUTH_RETRY_STATE_IDLE)
                                    ? AUTHENTICATION_NO_MITM : AUTHENTICATION_MITM;
                            mService.writeCharacteristic(mClientIf, address, handle,
                                    characteristic.getWriteType(), authReq,
                                    characteristic.getValue());
                            mAuthRetryState++;
                            return;
                        } catch (RemoteException e) {
                            Log.e(TAG, "", e);
                        }
                    }

                    mAuthRetryState = AUTH_RETRY_STATE_IDLE;

                    runOrQueueCallback(new Runnable() {
                        @Override
                        public void run() {
                            final BluetoothGattCallback callback = mCallback;
                            if (callback != null) {
                                callback.onCharacteristicWrite(BluetoothGatt.this, characteristic,
                                        status);
                            }
                        }
                    });
                }

但是異常情況凡伊,當(dāng)連接斷開或者permissionCheck 失敗,不會去寫characteristic,所以也就不會有onCharacteristicWrite

void writeCharacteristic(int clientIf, String address, int handle, int writeType, int authReq,
            byte[] value) {
        enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
        if (VDBG) {
            Log.d(TAG, "writeCharacteristic() - address=" + address);
        }
        if (mReliableQueue.contains(address)) {
            writeType = 3; // Prepared write
        }
        Integer connId = mClientMap.connIdByAddress(clientIf, address);
        if (connId == null) {
            Log.e(TAG, "writeCharacteristic() - No connection for " + address + "...");
            return;
        }
        if (!permissionCheck(connId, handle)) {
            Log.w(TAG, "writeCharacteristic() - permission check failed!");
            return;
        }
        gattClientWriteCharacteristicNative(connId, handle, writeType, authReq, value);
    }

由于沒有收到onCharacteristicWrite導(dǎo)致mDeviceBusy一直是true,后面再發(fā)送其他請求尺借,都會報(bào)錯芯丧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市叫编,隨后出現(xiàn)的幾起案子辖佣,更是在濱河造成了極大的恐慌,老刑警劉巖搓逾,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卷谈,死亡現(xiàn)場離奇詭異,居然都是意外死亡霞篡,警方通過查閱死者的電腦和手機(jī)世蔗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門端逼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凸郑,你說我怎么就攤上這事裳食。” “怎么了芙沥?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長浊吏。 經(jīng)常有香客問我而昨,道長,這世上最難降的妖魔是什么找田? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任歌憨,我火速辦了婚禮,結(jié)果婚禮上墩衙,老公的妹妹穿的比我還像新娘务嫡。我一直安慰自己,他們只是感情好漆改,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布心铃。 她就那樣靜靜地躺著,像睡著了一般挫剑。 火紅的嫁衣襯著肌膚如雪去扣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天樊破,我揣著相機(jī)與錄音愉棱,去河邊找鬼。 笑死哲戚,一個胖子當(dāng)著我的面吹牛奔滑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播顺少,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼朋其,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了祈纯?” 一聲冷哼從身側(cè)響起令宿,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎腕窥,沒想到半個月后粒没,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡簇爆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年癞松,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了爽撒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡响蓉,死狀恐怖硕勿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情枫甲,我是刑警寧澤源武,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站想幻,受9級特大地震影響粱栖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜脏毯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一闹究、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧食店,春花似錦渣淤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至率挣,卻和暖如春刻伊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背椒功。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工捶箱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人动漾。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓丁屎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親旱眯。 傳聞我的和親對象是個殘疾皇子晨川,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345