web-dev-qa-db-ja.com

Bluetooth接続に失敗しました "Java.io.IOException:読み取りに失敗しました。ソケットが閉じているかタイムアウトしている可能性があります。読み取りを再試行してください:-1"

Nexus 5にインストールされているアプリを介してデバイスを接続しようとしています。Androidで Rainbow Contacts のようなアプリを作成したいと思います。私のアプリでは、Bluetoothを介して別のデバイスに接続し、連絡先またはファイルのセットを転送することを目指しています。私は この質問 に従いましたが、そこに記載されている回避策は私にとっては機能しません ここ は私の完全なコードです。これは、ソケットを取得して接続を試みたアプリケーションのコードスニペットです。

ペアリングデバイスダイアログを通過できますが、ペアリングしようとするとエラーが発生します

//to create socket
if (secure) {
            bluetoothSocket = device.createRfcommSocketToServiceRecord(uuid);
        } else {
            bluetoothSocket = device.createInsecureRfcommSocketToServiceRecord(uuid);
        }
//connection establishment
try {

                bluetoothSocket.connect();
                success = true;
                break;
            } catch (IOException e) {
                //try the fallback
                try {
                    Class<?> clazz = tmp.getRemoteDevice().getClass();
                    Class<?>[] paramTypes = new Class<?>[] {Integer.TYPE};
                    Method m = clazz.getMethod("createRfcommSocket", paramTypes);
                    Object[] params = new Object[] {Integer.valueOf(1)};
                    bluetoothSocket  = (BluetoothSocket) m.invoke(tmp.getRemoteDevice(), params);
                    Thread.sleep(500);
                    bluetoothSocket.connect();
                    success = true;
                    break;
                } catch (FallbackException e1) {
                    Log.w("BT", "Could not initialize FallbackBluetoothSocket classes.", e);
                } catch (InterruptedException e1) {
                    Log.w("BT", e1.getMessage(), e1);
                } catch (IOException e1) {
                    Log.w("BT", "Fallback failed. Cancelling.", e1);
                }
            }

エラーが発生しています

09-06 13:44:57.247  27860-27860/com.example.gauravdubey.myapplication I/BT﹕ Attempting to connect to Protocol: 00001101-0000-1000-8000-00805f9b34fb
09-06 13:44:57.247  27860-27860/com.example.gauravdubey.myapplication W/BluetoothAdapter﹕ getBluetoothService() called with no BluetoothManagerCallback
09-06 13:44:57.247  27860-27860/com.example.gauravdubey.myapplication D/BluetoothSocket﹕ connect(), SocketState: INIT, mPfd: {ParcelFileDescriptor: FileDescriptor[56]}
09-06 13:44:58.667  27860-27860/com.example.gauravdubey.myapplication W/BluetoothAdapter﹕ getBluetoothService() called with no BluetoothManagerCallback
09-06 13:44:58.667  27860-27860/com.example.gauravdubey.myapplication D/BluetoothSocket﹕ connect(), SocketState: INIT, mPfd: {ParcelFileDescriptor: FileDescriptor[59]}
09-06 13:45:03.267  27860-27860/com.example.gauravdubey.myapplication W/BT﹕ Fallback failed. Cancelling.
    Java.io.IOException: read failed, socket might closed or timeout, read ret: -1
            at Android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.Java:505)
            at Android.bluetooth.BluetoothSocket.waitSocketSignal(BluetoothSocket.Java:482)
            at Android.bluetooth.BluetoothSocket.connect(BluetoothSocket.Java:324)
            at com.example.gauravdubey.myapplication.BluetoothConnector$FallbackBluetoothSocket.connect(BluetoothConnector.Java:198)
            at com.example.gauravdubey.myapplication.BluetoothConnector.connect(BluetoothConnector.Java:62)
            at com.example.gauravdubey.myapplication.ConnectThread.run(ConnectThread.Java:101)
            at com.example.gauravdubey.myapplication.MainActivity$1.onItemClick(MainActivity.Java:288)
            at Android.widget.AdapterView.performItemClick(AdapterView.Java:299)
            at Android.widget.AbsListView.performItemClick(AbsListView.Java:1113)
            at Android.widget.AbsListView$PerformClick.run(AbsListView.Java:2911)
            at Android.widget.AbsListView$3.run(AbsListView.Java:3645)
            at Android.os.Handler.handleCallback(Handler.Java:733)
            at Android.os.Handler.dispatchMessage(Handler.Java:95)
            at Android.os.Looper.loop(Looper.Java:136)
            at Android.app.ActivityThread.main(ActivityThread.Java:5001)
            at Java.lang.reflect.Method.invokeNative(Native Method)
            at Java.lang.reflect.Method.invoke(Method.Java:515)
            at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:785)
            at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:601)
            at dalvik.system.NativeStart.main(Native Method)
09-06 13:45:03.267  27860-27860/com.example.gauravdubey.myapplication V/connectThread﹕ Could not connect to device: B0:D0:9C:8B:A4:47
09-06 13:45:03.267  27860-27860/com.example.gauravdubey.myapplication I/Choreographer﹕ Skipped 361 frames!  The application may be doing too much work on its main thread.

だから私は何を間違っているのですか?どんな助けでもいただければ幸いです

13
Java_begins

BluetoothConnector.Javaのコンストラクターでは、idCandidatesのリストが渡されます。

_public BluetoothConnector(BluetoothDevice device, boolean secure, BluetoothAdapter adapter,
                              List<UUID> uuidCandidates) 
          {
        this.device = device;
        this.secure = secure;
        this.adapter = adapter;
        this.uuidCandidates = uuidCandidates;

        if (this.uuidCandidates == null || this.uuidCandidates.isEmpty()) {
            this.uuidCandidates = new ArrayList<UUID>();
            this.uuidCandidates.add(UUID.fromString("fa87c0d0-afac-11de-8a39-0800200c9a66"));
        }
    }
_

nullを渡しましたか?

はいの場合は、接続するBluetoothデバイスに対してdevice.fetchUuidsWithSdp()を呼び出し、レシーバーで_BluetoothDevice.ACTION_UUID_インテントを受信して​​みてください。これにより、デバイスでサポートされているuuidのリストが取得されます。

4
twister_void

ダーティキャッシュ。デバイスのどこでアプリのキャッシュをクリアするかを見つけて、再起動します。ポートをインターセプトして再発行するデバイスフロー制御インタラプタ(ファイアウォール、アプリウォール、セキュリティソフトウェア)がある可能性があります。これが問題です。起動時にインスタンス化する場所に応じて、アプリが望むものとは異なります。したがって、キャッシュを削って再起動し、キャッシュ/リダイレクトテーブルを元に戻すことで、テーブルを再構築します。これはひどく短命に聞こえることは知っていますが、私にとってはうまくいきました。

0
WU9I

try( "// try the fallback")内でこれを使用してください:

socket =(BluetoothSocket) device.getClass().getMethod("createRfcommSocket", new Class[] {int.class}).invoke(device,1);
socket.connect();

別のヒントは、別のUUIDを使用することかもしれません、それは問題を解決するかもしれません。


まだ試したかどうかはわかりませんが、 bluetoothチャットの例 で行ったのと同様に、ConnectThreadを作成する直前に、これを呼び出します関数:

public synchronized void connect(BluetoothDevice device) {

    // Cancel any thread attempting to make a connection
    if (mState == STATE_CONNECTING) {
        if (mConnectThread != null) {
            mConnectThread.cancel();
            mConnectThread = null;
        }
    }

    // Cancel any thread currently running a connection
    if (mConnectedThread != null) {
        mConnectedThread.cancel();
        mConnectedThread = null;
    }

    // Start the thread to connect with the given device
    mConnectThread = new ConnectThread(device);
    mConnectThread.start();
    setState(STATE_CONNECTING);
}
0
kalup

Android 5.0システムでは、ここで提案されているようにキャッシュをクリアする必要がある場合があります) http://www.gottabemobile.com/2014/12/01/nexus -Lollipop-problems-fixes /

また、PCと安価なBTドングルトランスミッターを使用している場合、メモリ内の以前の接続を占有しないように、BTドングルを切断する必要があるかもしれません。

0
sivi