0

そこで、GUI クラスを持つアプリケーションを作成しました。このアプリケーションは、トグルボタンがアクティブになったときに作成した別のアプリケーションからの 2 つの着信文字列をリッスンします。私が頭を悩ませているのは、着信バイトを読み取り、コードを介してGUIクラスで使用されている場所に戻す方法です。誰かが助けてくれることを願っています。

2 つの文字列を送信すると、両方のバイトを取得してから最初の文字列を送信し、「%」文字列のバイトを取得して区切り文字として送信し、2 番目の文字列を送信します。

public void ListenForAddress(View view)
{
    on = ((ToggleButton) view).isChecked();

    if(on)
    {
        Address address = reciever.RecieveObject();
        Intent intent = new Intent(this, Screen3.class);
        String adressStr = address.Address;
        intent.putExtra("ADRESS_MESSAGE", adressStr);
        String postalcodeStr = address.Postalcode;
        intent.putExtra("POSTALCODE_MESSAGE", postalcodeStr);
        intent.putExtra("ONE", 1);
        startActivity(intent);
    }
    else
    {
        reciever.closeReception();
    }   
}

ご覧のとおり、レシーバーを作成し、それを使用して RecieveObject() というメソッドを呼び出します。このメソッドは次のようになります。

public Address RecieveObject() 
{
    accThread = new AcceptThread();
    accThread.start();
    return null;
}

次のステップは、接続を作成し、管理スレッドを開始するスレッドです。

public class AcceptThread extends Thread {


public AcceptThread() {
    BluetoothServerSocket tmp = null;
    try {
    tmp = mBluetoothAdapter.listenUsingRfcommWithServiceRecord("Server", MY_UUID);
    } catch (IOException e) { }
    mmServerSocket = tmp;
}

public void run() {
    BluetoothSocket socket = null;
    while (true) {
        try {
            socket = mmServerSocket.accept();
        } catch (IOException e) {
            break;
        }
        // If a connection was accepted
        if (socket != null) {
            mConnSock = new manageConnectedSocket(socket);
            mConnSock.read();
            try {
                mmServerSocket.close();
            } catch (IOException e) {
            }
            break;
        }
    }
}
}

最後のステップは、データを処理するスレッドです

public class manageConnectedSocket extends Thread {

public manageConnectedSocket(BluetoothSocket socket) {
    mmSocket = socket;
    InputStream tmpIn = null;

    try {
        tmpIn = socket.getInputStream();
    } catch (IOException e) { }

    mmInStream = tmpIn;
}

public Address read() {
    byte[] buffer = new byte[1024];
    int bytes; 
    Address address = new Address("", "");
    int count = 0;

    while(count<2)
    {
        try {
            bytes = mmInStream.read(buffer);

            if(count==0)
            {
                address.Address = new String(buffer);
            }
            else
            {
                address.Postalcode = new String(buffer);
            }
            buffer = new byte[1024];

        } catch (IOException e) {
            break;
        }
    }
    return address;
}

}
4

1 に答える 1

2

住所と郵便番号を送信する場合は、区切り記号を付けて送信してください。安全性を高めるために、住所にも郵便番号にも、さらには一連の文字にも表示されない任意の文字を指定できます。例: !@#@!. への 1 回の呼び出しでデータを送信する必要がありますwrite

したがって、次のようにアドレスを送信しています。

String data = address + "!@#@!" + postalCode;
byte[] bytes = data.getBytes();
socket.getOutputStream().write(bytes);

アドレスを読み取るときは、スレッドをブロックするため、アドレスを取得するメソッドを呼び出さないでください。代わりに、アドレスの準備ができたら、接続スレッドからメソッドを呼び出します。この方法で therad を開始します。

manageConnectedSocket(socket).start();

そのrunメソッドで、文字列を読み取ります。

public void run() {
    byte[] data = new byte[1024]; //You can make this array larger, if you think it won't have enough space to contain some addresses.
    socket.getInputStream().read(data); //This may block the thread, if no data is currently available.
    String strings = new String(data);
    int seperatorIndex = strings.indexOf("!@#@!");
    String addressStr = strings.substring(0, seperatorIndex);
    String postalCode = strings.substring(seperatorIndex + 5); //5 is the length of "!@#@!".
    Address address = new Address(addressStr, postalCode);
    makeUseOfAddress(address); //Show it to the user, for example. Remember it's called from this thread, so if you want to interact with your UI, you have to run the interacting code on the UI thread and not here.
}
于 2012-12-03T19:24:08.290 に答える