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.
だから私は何を間違っているのですか?どんな助けでもいただければ幸いです
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のリストが取得されます。
ダーティキャッシュ。デバイスのどこでアプリのキャッシュをクリアするかを見つけて、再起動します。ポートをインターセプトして再発行するデバイスフロー制御インタラプタ(ファイアウォール、アプリウォール、セキュリティソフトウェア)がある可能性があります。これが問題です。起動時にインスタンス化する場所に応じて、アプリが望むものとは異なります。したがって、キャッシュを削って再起動し、キャッシュ/リダイレクトテーブルを元に戻すことで、テーブルを再構築します。これはひどく短命に聞こえることは知っていますが、私にとってはうまくいきました。
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);
}
Android 5.0システムでは、ここで提案されているようにキャッシュをクリアする必要がある場合があります) http://www.gottabemobile.com/2014/12/01/nexus -Lollipop-problems-fixes /
また、PCと安価なBTドングルトランスミッターを使用している場合、メモリ内の以前の接続を占有しないように、BTドングルを切断する必要があるかもしれません。