9

私は、Bluetooth接続を使用するアプリケーションを作っています。私はonCreate()でブルートゥース接続を呼び出し、MainActivityonDestroy()でそれを閉じています:AndroidでBluetoothSocketの画面ローテーションを閉じるにはどうすればよいですか?

// Bluetooth 
private Bluetooth bt; 
private boolean registered = false; 

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

    bt = new Bluetooth(this); 
    bt.enableBluetooth(); 
    bt.setCommunicationCallback(this); 
    bt.connectToName(bt.getBluetoothDevice(this)); 
    IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); 
    registerReceiver(mReceiver, filter); 
    registered = true; 
} 

@Override  
public void onDestroy() { 
    super.onDestroy(); 
    if(registered) { 
     unregisterReceiver(mReceiver); 
     registered=false; 
    } 
    bt.removeCommunicationCallback(); 
    bt.disconnect(); 
    if (handler != null && runnable != null) { 
     handler.removeCallbacks(runnable); 
    } 
} 

アプリはまた、(2種類のレイアウトを使用して)LANDSCAPEとPORTRAITモードをサポートしています。画面が回転すると、MainActivityは異なるレイアウトのためにonCreate()onDestroyの関数を呼び出します。私はInvalid heap address and fatal signal 11で見たよう

@@@ ABORTING: INVALID HEAP ADDRESS IN dlfree addr=0x5a71aa38 
A/libc: Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 1051 (le.bluetoothled) 

は、それがBluetoothSocketのclose()方法からだった。そのため、私は、次のエラーを得ました。まず、私たちは画面を回転させるときには近くのブルートゥースが必要ないと思うので、この方法を電話機のdetect rotation eventに使用しようとしましたが、回転が起こっても閉じないようにしましたが、動作しません。したがって、私は、画面の回転時にBluetoothを閉じる必要があるかもしれないと思うが、私は上記のエラーがある。私はこれをどのように解決できるのか分かりません。その問題を解決するのに手伝ってくれますか?

public void disconnect() { 
     try { 
      socket.close(); 
     } catch (IOException e) { 
      if(communicationCallback!=null) 
       communicationCallback.onError(e.getMessage()); 
     } 
    } 

を私の現在のソリューションは、睡眠を使用していると次のように私はdisconnect()thisブルートゥースのlibを使用しています。 closeソケットの前にThread.sleep (1000)を追加しました。それは働いている。しかし、私はそれが非常に良い解決策ではないと思う。

+0

あなたの 'Bluetooth'クラスは何ですか?それは 'サービス'ですか? – Bryan

+0

いいえ普通のクラスはhttps://github.com/omaflak/Bluetooth-Library/blob/master/bluetooth/src/main/java/me/aflak/bluetooth/Bluetooth.javaです – Jame

+0

Bluetooth接続のために作成したスレッドはまだ実行されていて、デバイスを回転していますか?彼らは古い活動を参照し続けます。アクティビティコールバックへの参照をクリアしようとしていますが、nullの場合は別のスレッドにチェックインします。それは安全ではありません。 – masp

答えて

0

アクティビティ内にFragmentを追加して、方向変更を処理するためにsetRetainInstnceこのフラグメントを呼び出すことができます。 Bluetoothを使用してロジックをFragmentに移動します。これを実装する方法を見てくださいherehere

+0

それは良くありません。実際には、私は上記のエラー – Jame

0

は尊敬アクティビティタグ内のマニフェストファイルにこのタグを追加

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    //disconnect your bluetooth 
} 
+0

を解決しようとしています。それは良くありません。実際には、私は上記のエラーを解決しようとしています – Jame

0

このコードを試してみてください。 尊重されたアクティビティでマニフェストにこのタグを追加すると、アクティビティはその状態を維持でき、オリエンテーションの変更中にonDestroy()は呼び出されず、Bluetoothソケットは閉じられません。

アンドロイド:configChanges = "keyboardHidden |オリエンテーション|画面サイズ"

1

あなたは、Bluetooth使用してはならない - の原則(SOLIDを参照してください)活動の内側に関連するものを。アクティビティは単なるUIです。バックグラウンドでUIから独立して実行され、すべてのBluetooth関連のアクションを管理する個別のサービスを作成する必要があります。アクティビティからonResume()メソッドでそのサービスにバインドし、onPause()メソッドでバインドを解除します。バインディング中にServiceによって渡されたServiceConnectionから、bt-制御インタフェースを取得できます。 Googleの素晴らしいBluetoothの例があります(https://github.com/googlesamples/android-BluetoothChat)。唯一の欠点は、メッセージを渡すためにHandlerを使用することです。私はそれを少し修正しました - 今、別のスレッドがあり、すべての状態メッセージとコールバックコールバックを受け取ります。このコードを自由に使用してください: https://github.com/AlexShutov/LEDLights

関連する問題