【Bluetooth】 oppプロファイルについて

697 views
Skip to first unread message

iwama

unread,
Jan 21, 2014, 8:48:46 PM1/21/14
to android-g...@googlegroups.com
岩間と申します。

AndroidのBluetooth接続について開発初心者のため助言を頂きたいです。

よろしくお願いいたします。



現在、Bluetoothの標準サンプルであるBluetoothChatを参考にし、

SerialPortのプロファイルを使用してのファイルの送受信に成功しました。



次に、opp obexプロファイルを使用してファイルの送受信を行いたいのですが、

サーバソケットを取得するlistenUsingRfcommWithServiceRecordで


  01-22 10:31:38.915: E/BluetoothChatService(8270): Socket Type: Securelisten() failed
  01-22 10:31:38.915: E/BluetoothChatService(8270): java.io.IOException: Not able to register SDP record for BluetoothSecure


以上のエラーが発生しサーバソケットを取得できないため、その後の


  socket = mmServerSocket.accept();


でNullPointerExceptionのエラーでアプリが落ちてしまいます。

UUIDをSerialPortからopp obexに変更する他に何か特別な処理はいるのでしょうか?


どなたか回避方法を知っている方がいればご教授願います。




該当ソースは以下です。

private static final String NAME_SECURE = "BluetoothSecure";
private static final String NAME_INSECURE = "BluetoothInsecure";
private static final UUID MY_UUID_SECURE = UUID.fromString("00001105-0000-1000-8000-00805F9B34FB");
private static final UUID MY_UUID_INSECURE= UUID.fromString("00001105-0000-1000-8000-00805F9B34FB");


public synchronized void start() {
        // connenct threadの初期化
        if (mConnectThread != null) {mConnectThread.cancel(); mConnectThread = null;}

        // connected threadの初期化
        if (mConnectedThread != null) {mConnectedThread.cancel(); mConnectedThread = null;}       

        // Start the thread to listen on a BluetoothServerSocket
        if (mSecureAcceptThread == null) {
            mSecureAcceptThread = new AcceptThread(true);
            mSecureAcceptThread.start();
        }
        if (mInsecureAcceptThread == null) {
            mInsecureAcceptThread = new AcceptThread(false);
            mInsecureAcceptThread.start();
        }

}


private class AcceptThread extends Thread {
// ローカルサーバソケット
private final BluetoothServerSocket mmServerSocket;
private String mSocketType;

public AcceptThread(boolean secure) {
BluetoothServerSocket tmp = null;
mSocketType = secure ? "Secure" : "Insecure";

// 新しいリスニングサーバソケットを作成します。
try {
if (secure) {
tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME_SECURE, MY_UUID_SECURE);
} else {
tmp = mAdapter.listenUsingInsecureRfcommWithServiceRecord(NAME_INSECURE, MY_UUID_INSECURE);
}
} catch (IOException e) {
Log.e(TAG, "Socket Type: " + mSocketType + "listen() failed", e);
}
mmServerSocket = tmp;
}

public void run() {
if (D)
Log.d(TAG, "Socket Type: " + mSocketType
+ "BEGIN mAcceptThread" + this);
setName("AcceptThread" + mSocketType);

BluetoothSocket socket = null;

// 接続していない場合は、サーバソケットを聞く
while (mState != STATE_CONNECTED) {
try {
// これはブロッキング呼び出しであり、唯一の成功した接続または例外に戻ります
socket = mmServerSocket.accept();
} catch (IOException e) {
Log.e(TAG, "Socket Type: " + mSocketType
+ "accept() failed", e);
break;
}

// 接続が受け入れられた場合
if (socket != null) {
synchronized (BluetoothService.this) {
switch (mState) {
case STATE_LISTEN:
case STATE_CONNECTING:
// 正常の場合。接続スレッドを起動します。
connected(socket, socket.getRemoteDevice(),
mSocketType);
break;
case STATE_NONE:
case STATE_CONNECTED:
// 準備または既に接続されない場合。新しいソケットを終了します。
try {
socket.close();
} catch (IOException e) {
Log.e(TAG, "Could not close unwanted socket", e);
}
break;
}
}
}
}
if (D)
Log.i(TAG, "END mAcceptThread, socket Type: " + mSocketType);

}

iwama

unread,
Jan 23, 2014, 2:52:57 AM1/23/14
to android-g...@googlegroups.com
岩間です。

乏しい英語力で海外サイトを調べていました。。。


アンドロイド2.0以降、標準でoppプロファイルのソケットを開いていることがわかりました。

なのでクライアント側でcreateRfcommSocketToServiceRecordを行うとoppソケット通信が可能になると記述してあるのですが、

これだと標準で開いているoppプロファイルとソケット通信してしまう気がするのですが、

自分で作成したアプリ同士でoppプロファイルを使用してソケット通信を行うことは不可能なのでしょうか?

Shin Miyazaki

unread,
Jan 23, 2014, 3:53:12 AM1/23/14
to android-g...@googlegroups.com
こんにちは、みやざきです。

少なくとも今のandroidではbluetoothでのファイル送受信のアプリは標準で備わっています。
ので、ファイル受信はそのアプリが受け付けているわけですね。

絶対にあなたの作成しているアプリでOPPでのファイル送受信を実装しなければならない、
ということでなければ、そちらのアプリにすべて任せてしまってはいかがでしょうか?



2014年1月23日 16:52 iwama <iwama...@gmail.com>:

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。

iwama

unread,
Jan 23, 2014, 8:22:51 PM1/23/14
to android-g...@googlegroups.com
To:みやざき様

返信ありがとうございます。

やはりそうですよね。


しかし標準の機能を使うとダイアログに気づかず承認しない場合

壊れたデータが作成されるので、

作成したアプリ内でOPPでのファイル送受信を行いたいです、、、


もし作成したアプリ同士でopp通信を行う方法をご存じであればご教授願いたいです。。



2014年1月23日木曜日 17時53分12秒 UTC+9 shinm:
Reply all
Reply to author
Forward
0 new messages