2012-09-18 31 views
7

申し訳ありません。私はBluetooth対応のGalaxy Nexus携帯電話を2台持っていました。Android Bluetooth IOException:接続が拒否されました

私はデバイスの検出と接続に使用するBluetooth接続管理アプリケーションを作成しました。また、デバイスがサポートできるすべての利用可能なUUIDを出力します。

http://www.bluetooth.org/Technical/AssignedNumbers/service_discovery.htm次の標準的なUUIDは、Galaxy Nexusデバイスから公開されています。

  • 0x1116 - NAP
  • 0x112f - PBAP(電話帳アクセスプロファイル)
  • 0x111f - HFP(ハンズフリー)
  • 0x1105 - OPP(オブジェクトプッシュプロファイル)
  • 0x1112 - HSP(ヘッドセットプロファイル)
  • 0x110c - AVRCP
  • 0x110a - A2DP

OPPプロファイル(UUID 00001105-0000-1000-8000-00805F9B34FB)で接続し、デバイス間でオブジェクト(ファイル)をプッシュしようとしています。私はすべてのBluetooth接続を検出、ペア/ボンド(スレッドなど)し、管理する方法についてはAndroid API documentation全体に行ってきました。私は正常に接続し、SPP(0x1101)プロファイルを介してレガシーボードデバイスと通信することができました。

しかし、ギャラクシーネクサスの2台の電話機の間でsocket.connect()を使用しようとすると、ペア設定のダイアログが表示され、両方のデバイスでPairボタンをクリックします。その後、すぐにConnection Refused IOExceptionになります。ペアリングが一度発生した後は、安全なリンクがキャッシュされているので意味をなさないことに再度尋ねられることはありません。

これらの標準のUUIDを使用してこれらの標準プロファイルに接続できない場合、なぜ公開されますか?私のアプリからこれらのプロファイルのいずれかに接続し、それらとやりとりするにはどうすればいいですか?それは私のアプリがどうにか信頼されていないからですか?奇妙なことは、AndroidのShare機能も全く機能しないということです。 Androidで完全に壊れているのですか?

ドキュメントのように「よく知られているUUID SPP one 0x1101」を使用するためのヒントは避けてください。これは私が望むものではありません。私はこのことがどう機能するかをかなりよく理解しており、問題の実際の解決策や説明を探しています。

私は典型的な "リフレクション"ソリューションを見ましたが、これはまだAndroidでこれがまだ問題であると理解していませんか?なぜ人々はこの作品を作るために反射を使用するのですか?これを修正するためにAndroidにバグを報告することはできますか?

これらのUUIDが標準であれば、どのアプリもそれらに接続して対話できる必要があります。なぜこれが問題なのですが、なぜこの例外が発生しますか?

ありがとうございます。

UPDATEだから、何らかの理由でAndroidシステムのオブジェクトプッシュが仕事を始めました。私は実際に私のアプリを介して接続しようとしたが、それは動作していませんでした。その後、私は連絡先アプリに行って、魔法のように働いた連絡先を共有しようとしました。それから、私は私のアプリに戻ってきました、そして、今それは働きます...うわー。それは非常に奇妙で、これには説明が必要です。

+0

あなたは正しい権限を設定していますか? http://developer.android.com/guide/topics/connectivity/bluetooth.html#Permissions – Lars

+0

@Larsもちろん、彼はそうしました。 dnkoutso:ソケットはどのくらい開いていますか?あなたは再ペアリングを試みることができますか、それはペアリングしてからもう一度ペアリングしてください。 Btw、それは2層ですか? – nullpotent

+0

@ccthedral 2ティアはどういう意味ですか?私はしばしば両方のデバイスで実際の設定アプリに入り、ペアリングを削除します。一旦私が 'socket.connect()'をもう一度呼び出すと、ペアリングのダイアログとパスキーの入力を促すメッセージが表示されます。残念ながら、「Connection Refused」IOExceptionが発生した直後です。 – dnkoutso

答えて

2

非標準プロファイルを使用してみましたか?つまり、あなたのアプリ用のカスタムUUIDです。これはまた、同じプロファイルで登録されている他のアプリではなく、自分のアプリにのみ接続している可能性が高いことを知るのに役立ちます。

私の経験から、Bluetoothペアリングは最初のペアの試行では非常にバグが多いです。しかし、カスタムを使用してUUIDこれは多少役立ちます。

私は考えていましたが、もともとは特定のデバイスでバグを修正しようとしていましたが、他の場所でもそれを使用して成功した人がいると思います。このデバイスはSpicaなどと呼ばれていました。

また、コメントの1つが掲載されているので、私はまた失敗した後に再度接続しようとします。

最初に失敗するコードを基本的に作成しますが、失敗した場合は5秒後に再度接続しようとします。

これらは不完全な解決策ですが、AndroidでのBluetooth実装も不完全です(IMHO)。私は何かが確かにバグがあることに同意

:それは質問の更新とコメントをもとに

EDIT

に役立ちます願っています。私が思うところでは、BTのドライバはさまざまで、それぞれに違ったBTスタックがあります。私はまた、反映方法ANDカスタム両方を使用する質問を見つけたUUID、および他の標準的な方法。これは私には極端に思えるが、最も重要な部分をカバーしている。残念ながら、アプリ開発者としては、低レベルのスタック/コード/ドライバを制御することはできません。

私の2つのBluetooth共有アプリケーションでは、の最初のペアリングは常に手間がかかりますです。

私はそれが私だけではないことを知ってうれしいです。

+1

私は自分のカスタムUUIDと接続することができました。私はこれらの公式にBluetooth標準UUIDがどのように動作していないのか分かりません。彼らはまた、Androidの "共有"システム上で動作していません。これは、Androidコードで何かバグがあるヒントです。 – dnkoutso

+0

私は何かが間違いなくバギーであることに同意します。私が思うところでは、BTのドライバはさまざまで、それぞれに違ったBTスタックがあります。私はまた、リフレクション方法とカスタム、およびその他の標準的な方法の両方を使用する質問を見つけました。これは私には極端に思えるが、最も重要な部分をカバーしている。残念ながら、アプリ開発者としては、低レベルのスタック/コード/ドライバを制御することはできません。 – pjco

4

私はこの同じ問題に遭遇し、私のために働く解決策を見つけることができました。

私の場合、3種類のテストデバイス(Nexus 5、Galaxy S4、Note 2)を使用していますが、何らかの理由でNote 2がBluetoothモジュールに接続されず、他の2つが接続されます。

私が見つけたのは、Bluetoothドライバはさまざまで、異なるデバイス間の接続を作成するには若干異なる接続方法が必要であるということです。

私が使用する3つの方法は、「安全」、「安全」、「反射法」/「hax」と呼ばれています。私は2しか使用して 'を作品ノートを発見し、私の場合は

  switch(connType) 
      { 
      case Secure: 
       tmpSocket = device.createRfcommSocketToServiceRecord(_uuid); 
       break; 

      case Insecure: 
       tmpSocket = device.createInsecureRfcommSocketToServiceRecord(_uuid); 
       break; 

      case Hax: 
       Method createSocket = device.getClass().getMethod("createRfcommSocket", new Class[] {int.class}); 
       tmpSocket = (BluetoothSocket)createSocket.invoke(device, Integer.valueOf(1)); 
       break; 
      } 

は、セキュアモードでは、両方のNexus 5のために働いたとギャラクシーS4は、しかし、それはいくつかのテストの後注2.

のために動作しませんでした私は基本的に接続を試み、必要に応じてさまざまなモードを繰り返します。別の接続モードを試してみると、単に「接続を再試行しています」というメッセージが表示されます。したがって、接続が安全ではない場合は、Insecureを使用してから反射方式を使用します。

私は、これらの3つの方法のいずれかが機能していないケースに遭遇していません。

関連する問題