9589


Androidでアプリ開発をしているのですが、BLE経由でカメラの電源を入れる具体的な手順について教えて下さい。  
ドキュメントや`wakeup()`を呼んだ時のエラーの内容から、現在のところ

[code]

    camera = new OLYCamera();
    camera.setContext(getApplicationContext());
    camera.setConnectionListener(this);
    oa_central=OACentralConfiguration.load();
    btName=oa_central.getBleName();
    btCode=oa_central.getBleCode();
    
[/code]

と準備をし`startLeScan()`で以下の様なコールバックが呼ばれるようにしているのですが

[code]

    private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback(){
        @Override
        public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord){
            if (btName.equals(device.getName())){
                btAdapter.stopLeScan(this);
                btDevice = device;
                try {
                    camera.setBluetoothDevice(btDevice);
                    camera.setBluetoothPassword(btCode);
                    camera.wakeup();
                    camera.connect(OLYCamera.ConnectionType.BluetoothLE);
                } catch (OLYCameraKitException e) {
                    Log.w(TAG, "To connect to the camera is failed: " + e.getMessage());
                }
            }
        }
    };
    
[/code]

`wakeup()`時にGATTデバイスの接続に失敗というエラーが出たところで詰んでいます。

> I/OLYCameraLog: [INFO] [OLYCamera.java:1167:OLYCamera#wakeup]  
>  D/BluetoothGatt: connect() - device: 90:B6:86:08:41:12, auto: false  
>  D/BluetoothGatt: registerApp()  
>  D/BluetoothGatt: registerApp() - UUID=2ff089f3-5321-45a7-84a7-87b8166b47f7  
>  D/BluetoothGatt: cancelOpen() - device: 90:B6:86:08:41:12  
>  D/BluetoothGatt: close()  
>  D/BluetoothGatt: unregisterApp() - mClientIf=0  
>  E/OLYCameraLog: [ERROR] [OLYCamera.java:1187:OLYCamera#wakeup]
> jp.co.olympus.camerakit.c: Failed to connect the GATT device.

`connectGatt()`を自前で呼んでみたり、`wakeup()`をBluetoothGattCallbackで実行してみたりと試してみましたが、エラー内容に変化がありません。  
他にどのような手順が必要でしょうか？

## 追記

@ura14h
さんの提案通りに`CountDownLatch`を使って`onLeScan()`後に`wakeup()`してみたところ、デバイスとの接続はうまくいくようになったように見えますが、新たなエラーが出るようになりました。

> I/OLYCameraLog: [INFO] [OLYCamera.java:1167:OLYCamera#wakeup]  
>  D/BluetoothGatt: connect() - device: 90:B6:86:08:41:12, auto: false  
>  D/BluetoothGatt: registerApp()  
>  （中略）  
>  D/BluetoothGatt: onCharacteristicWrite() - Device=90:B6:86:08:41:12
> UUID=59168c27-b5cd-40c7-9ee0-f5ec2e927346 Status=0  
>  E/OLYCameraLog: [ERROR] [OLYCamera.java:1228:OLYCamera#wakeup]
> jp.co.olympus.camerakit.i: The peripheral gave back status 1.  
>  D/BluetoothGatt: cancelOpen() - device: 90:B6:86:08:41:12


CC BY-SA 3.0
2015-04-25T16:19:35.953
9552
2015-04-27T14:59:58.780
2015-04-27T14:59:58.780
9482
9482
question
android bluetooth olympus-camerakit
Android + OPC, Bluetooth経由でカメラの電源を入れる方法


詰んでいる(ハングアップしている)ということは、Bluetoothの通信スレッド同士でデッドロックしているかもしれません。そうであればwakeup()とconnect()をonLeScan()の後に実行するようにした方が良いかも。手順としては

  1. デバイス検索中フラグを準備(CountDownLatchとか)
  2. onLeScan()でsetBluetoothDevice(),setBluetoothPassword()とそしてデバイス検索中フラグを解放する
  3. startLeScan()する
  4. デバイス検索中フラグが解放されるのをawait()で待つ
  5. 待ちから正しく抜けてきたらwakeup()とconnect()

という流れです。


CC BY-SA 3.0
2015-04-27T06:18:36.700
9589
2015-04-27T06:18:36.700
7283
9552
answer