2014年11月30日日曜日

mBluetoothAdapter.isEnabled()がうまく動かない

はまった。

Androidアプリに、Bluetoothの機能を持たせたいとき。
公式のサンプルであるBluetoothChatでは、
今Bluetoothの機能がOFFになっていたら、ONにするため、
onStartの中で、mBluetoothAdapter.isEnabled()を呼び出して確認しています。
で、OFFになってたら、startActivityForResultを使って端末の設定画面に飛んで、ユーザに手動で
BluetoothをONにしてもらってます。

    @Override
    public void onStart() {
        super.onStart();
        if(D) Log.e(TAG, "++ ON START ++");

        if (!mBluetoothAdapter.isEnabled()) {
            Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableIntent, REQUEST_ENABLE_BT);
        } else {
            if (mChatService == null) setupChat();
        }
    }

こう。

その次のonResumeで、接続の初期化をしてます。

    @Override
    public synchronized void onResume() {
        super.onResume();
        if(D) Log.e(TAG, "+ ON RESUME +");

        if (mChatService != null) {
            if (mChatService.getState() == BluetoothChatService.STATE_NONE) {
              mChatService.start();
            }
        }
    }

こう。

で、このプログラムだと、最初にBluetoothの機能がOFFのときのプログラムの流れは、

プログラム開始

onCreate()

onStart()

onResume()

onPause()

設定画面へジャンプ

onResume()

というかんじで、onResume()を二回通っているのです。
だから、一回目のonResume()では、まだBluetooth機能がONになってないから、通信の初期化処理を防ぐ機構が必要なのです。
サンプルプログラムでは、mChatServiceがnullかどうか、というのがBluetooth機能のON/OFF状態を示すフラグの代わりになってます。


であるので、mChatServiceをなくしちゃおうと画策する俺のような人は、Bluetooth機能のON/OFFフラグをちゃんと作らないといけないのです。



たぶん。






0 件のコメント:

コメントを投稿