6

タブレットからμコントローラーにバイトコードを送るアプリを書いています。Lenovo A1 (Androi 2.3) と Samsung Galaxy Tab 7 Plus N (Android 3.2) ではすべて問題なく動作しました。現在、新しい Samsung Galaxy Tab 2 (Android 4.0) で問題が発生しています。

Bluetooth アンテナ (μ-controller に接続され、シリアル プロトコルで通信する) とペアリングできます。アプリを起動すると、パスワードの入力とペアリングを再度求められます。ペアリング パスワードを入力すると、メイン レイアウトが表示されますが、接続が確立されません。

日食のLogCatは私に伝えます:

06-19 16:00:20.656: V/BluetoothSocket.cpp(3189): availableNative
06-19 16:00:20.664: V/BluetoothSocket.cpp(3189): abortNative
06-19 16:00:20.664: V/BluetoothSocket.cpp(3189): ...asocket_abort(49) complete
06-19 16:00:20.664: I/ActivityManager(185): No longer want com.google.android.partnersetup (pid 3220): hidden #16
06-19 16:00:20.671: V/BluetoothSocket.cpp(3189): availableNative
06-19 16:00:20.671: V/BluetoothSocket.cpp(3189): destroyNative
06-19 16:00:20.671: V/BluetoothSocket.cpp(3189): ...asocket_destroy(49) complete
06-19 16:00:20.679: D/KeyguardViewMediator(185): setHidden false
06-19 16:00:20.679: W/System.err(3189): java.io.IOException: socket closed
06-19 16:00:20.679: W/System.err(3189):     at android.bluetooth.BluetoothSocket.available(BluetoothSocket.java:370)
06-19 16:00:20.679: W/System.err(3189):     at android.bluetooth.BluetoothInputStream.available(BluetoothInputStream.java:40)
06-19 16:00:20.679: W/System.err(3189):     at java.io.BufferedInputStream.available(BufferedInputStream.java:114)
06-19 16:00:20.687: W/System.err(3189):     at ebs.alphadidact.control.ReceiveThread.run(ReceiveThread.java:79)

さらに、LogCat は何千回もメッセージを受け取ります。

V/BluetoothSocket.cpp(3189): availableNative

それで、ウェブで検索したところ、同様の問題を抱えているが解決策がない人が何人か見つかりました。誰かがこの問題について何か知っていますか?

多分それはアンテナとアンドロイド4.0の間の互換性の問題です. 私が言ったように、同じコードが古いAndroidバージョンで完全に実行されているため、エラーが私のコードにあるとは思いません。

4

5 に答える 5

4

わかりました、問題が何であるかがわかりました。それが単なる Samsung の問題なのか、それとも Android ICS の問題なのかはわかりません。

(ソケットを取得するために)を使用して、通常どおりアンテナに接続しようとしました:

clientSocket = device.createRfcommSocketToServiceRecord(MY_UUID);

私のアンテナとタブレットのセットアップではうまくいかないようです。

clientSocket = device.createInsecureRfcommSocketToServiceRecord(MY_UUID);

これは機能します。最初のオプションでは、システムがアンテナのペアリングを解除し、後でペアリングを再度要求する必要がありました。

于 2012-06-21T09:35:55.203 に答える
2

@fuentessifuentes の回答のおかげで、下位互換性を含むこのメソッドを作成しました。

private BluetoothSocket createBluetoothSocket(BluetoothDevice device) throws IOException {
    if(Build.VERSION.SDK_INT >= 10){
        try {
            final Method  m = device.getClass().getMethod("createInsecureRfcommSocketToServiceRecord", new Class[] { UUID.class });
            return (BluetoothSocket) m.invoke(device, SPP_UUID);
        } catch (Exception e) {
            Log.e(TAG, "Could not create Insecure RFComm Connection",e);
        }
    }
    return  device.createRfcommSocketToServiceRecord(SPP_UUID);
}

たぶん、この問題から誰かを助けるでしょう。

于 2012-12-28T13:25:10.187 に答える
2

実際に安全でないソケットを作成することは、ペアになっていない 2 つのデバイスを接続することと同じです。これは明らかに、それを処理する最善の方法ではありません。

Android がデバイスの修復を試みた後、ペアリングの応答を拒否することがわかりました。この奇妙な動作の後、次の接続試行を受け入れます!

Android バグトラッカーも試しました: Bluetooth RFCOMM Server Socket は、ICS 4.0.3 の組み込みデバイスに正しく接続されなくなりました

引き続き回答お待ちしております…

于 2012-07-03T14:48:37.600 に答える
1

私は同じ問題を見ていると信じています。デバイスをストックドロイドxとペアリングした後、完全に機能するGoogleプレイのsppターミナルアプリを使用しています。しかし、同じアプリと同じデバイスを備えた Galaxy s3 では、毎回再ペアリングする必要があります。

あなたの解決策は一種の回避策です。AndroidはICSでこの動作を変更したようです。したがって、本当の修正は、Google が ICS を修正して、spp デバイスがペアリングしなくてもペアリングして接続できるようにすることです。

しかし、同様の問題に対処するためのコードがいくつかありました。

BluetoothSocket mSocket = null;
mBluetoothAdapter.cancelDiscovery();
Method method;
try {
    method = mBluetoothDevice.getClass()
        .getMethod("createRfcommSocket", new Class[] { int.class});
    mSocket = (BluetoothSocket) method.invoke(mBluetoothDevice,1);
} catch (NoSuchMethodException e1) {
    e1.printStackTrace();
} catch (IllegalArgumentException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
} catch (InvocationTargetException e) {
    e.printStackTrace();
}

mSocket.connect();
于 2012-07-21T13:18:24.720 に答える
0

このコードの使用:

BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
mBluetoothAdapter.cancelDiscovery();

Method m;
try {
    m = device.getClass().getMethod("createInsecureRfcommSocket", new Class[] { int.class });
    btSocket = (BluetoothSocket) m.invoke(device, 1);
} catch (SecurityException e1) {
    e1.printStackTrace();
} catch (NoSuchMethodException e1) {
    e1.printStackTrace();
} catch (IllegalArgumentException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
} catch (InvocationTargetException e) {
    e.printStackTrace();
}

アプリのマニフェストに以下を追加するとうまくいきました

<uses-sdk android:minSdkVersion="13" android:targetSdkVersion="16"/>

于 2012-08-07T14:55:31.033 に答える