change the way bytes are read from InputStream.
Read only the bytes received and don't allocate new arrays Also revise the mechanism for writing the outgoing messages to the screen to be more consistent with reading and cleanup line lengths to be <100 chars.
This commit is contained in:
@@ -50,14 +50,13 @@ public class BluetoothChat extends Activity {
|
|||||||
// Message types sent from the BluetoothChatService Handler
|
// Message types sent from the BluetoothChatService Handler
|
||||||
public static final int MESSAGE_STATE_CHANGE = 1;
|
public static final int MESSAGE_STATE_CHANGE = 1;
|
||||||
public static final int MESSAGE_READ = 2;
|
public static final int MESSAGE_READ = 2;
|
||||||
public static final int MESSAGE_OUTGOING_STRING = 3;
|
public static final int MESSAGE_WRITE = 3;
|
||||||
public static final int MESSAGE_DEVICE_NAME = 4;
|
public static final int MESSAGE_DEVICE_NAME = 4;
|
||||||
public static final int MESSAGE_TOAST = 5;
|
public static final int MESSAGE_TOAST = 5;
|
||||||
|
|
||||||
// Key names received from the BluetoothChatService Handler
|
// Key names received from the BluetoothChatService Handler
|
||||||
public static final String DEVICE_NAME = "device_name";
|
public static final String DEVICE_NAME = "device_name";
|
||||||
public static final String TOAST = "toast";
|
public static final String TOAST = "toast";
|
||||||
public static final String MESSAGE_WRITE = "message_write";
|
|
||||||
|
|
||||||
// Intent request codes
|
// Intent request codes
|
||||||
private static final int REQUEST_CONNECT_DEVICE = 1;
|
private static final int REQUEST_CONNECT_DEVICE = 1;
|
||||||
@@ -192,9 +191,10 @@ public class BluetoothChat extends Activity {
|
|||||||
|
|
||||||
private void ensureDiscoverable() {
|
private void ensureDiscoverable() {
|
||||||
if(D) Log.d(TAG, "ensure discoverable");
|
if(D) Log.d(TAG, "ensure discoverable");
|
||||||
if (mBluetoothAdapter.getScanMode() != BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
|
if (mBluetoothAdapter.getScanMode() !=
|
||||||
|
BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
|
||||||
Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
|
Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
|
||||||
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); // set max duration
|
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
|
||||||
startActivity(discoverableIntent);
|
startActivity(discoverableIntent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -223,7 +223,8 @@ public class BluetoothChat extends Activity {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// The action listener for the EditText widget, to listen for the return key
|
// The action listener for the EditText widget, to listen for the return key
|
||||||
private TextView.OnEditorActionListener mWriteListener = new TextView.OnEditorActionListener() {
|
private TextView.OnEditorActionListener mWriteListener =
|
||||||
|
new TextView.OnEditorActionListener() {
|
||||||
public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
|
public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
|
||||||
// If the action is a key-up event on the return key, send the message
|
// If the action is a key-up event on the return key, send the message
|
||||||
if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_UP) {
|
if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_UP) {
|
||||||
@@ -257,20 +258,27 @@ public class BluetoothChat extends Activity {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case MESSAGE_OUTGOING_STRING:
|
case MESSAGE_WRITE:
|
||||||
mConversationArrayAdapter.add("Me: " + new String(msg.getData().getByteArray(MESSAGE_WRITE)).trim());
|
byte[] writeBuf = (byte[]) msg.obj;
|
||||||
mOutEditText.setText(mOutStringBuffer);
|
// construct a string from the buffer
|
||||||
|
String writeMessage = new String(writeBuf);
|
||||||
|
mConversationArrayAdapter.add("Me: " + writeMessage);
|
||||||
break;
|
break;
|
||||||
case MESSAGE_READ:
|
case MESSAGE_READ:
|
||||||
byte[] buf = (byte[]) msg.obj;
|
byte[] readBuf = (byte[]) msg.obj;
|
||||||
mConversationArrayAdapter.add(mConnectedDeviceName+": " + new String(buf).trim());
|
// construct a string from the valid bytes in the buffer
|
||||||
|
String readMessage = new String(readBuf, 0, msg.arg1);
|
||||||
|
mConversationArrayAdapter.add(mConnectedDeviceName+": " + readMessage);
|
||||||
break;
|
break;
|
||||||
case MESSAGE_DEVICE_NAME:
|
case MESSAGE_DEVICE_NAME:
|
||||||
mConnectedDeviceName = msg.getData().getString(DEVICE_NAME); // save the connected device's name
|
// save the connected device's name
|
||||||
Toast.makeText(getApplicationContext(), "Connected to " + mConnectedDeviceName, Toast.LENGTH_SHORT).show();
|
mConnectedDeviceName = msg.getData().getString(DEVICE_NAME);
|
||||||
|
Toast.makeText(getApplicationContext(), "Connected to "
|
||||||
|
+ mConnectedDeviceName, Toast.LENGTH_SHORT).show();
|
||||||
break;
|
break;
|
||||||
case MESSAGE_TOAST:
|
case MESSAGE_TOAST:
|
||||||
Toast.makeText(getApplicationContext(), msg.getData().getString(TOAST), Toast.LENGTH_SHORT).show();
|
Toast.makeText(getApplicationContext(), msg.getData().getString(TOAST),
|
||||||
|
Toast.LENGTH_SHORT).show();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -283,7 +291,8 @@ public class BluetoothChat extends Activity {
|
|||||||
// When DeviceListActivity returns with a device to connect
|
// When DeviceListActivity returns with a device to connect
|
||||||
if (resultCode == Activity.RESULT_OK) {
|
if (resultCode == Activity.RESULT_OK) {
|
||||||
// Get the device MAC address
|
// Get the device MAC address
|
||||||
String address = data.getExtras().getString(DeviceListActivity.EXTRA_DEVICE_ADDRESS);
|
String address = data.getExtras()
|
||||||
|
.getString(DeviceListActivity.EXTRA_DEVICE_ADDRESS);
|
||||||
// Get the BLuetoothDevice object
|
// Get the BLuetoothDevice object
|
||||||
BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
|
BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
|
||||||
// Attempt to connect to the device
|
// Attempt to connect to the device
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ public class BluetoothChatService {
|
|||||||
private int mState;
|
private int mState;
|
||||||
|
|
||||||
// Constants that indicate the current connection state
|
// Constants that indicate the current connection state
|
||||||
public static final int STATE_NONE = 0; // we're doing nothing. only valid during setup/shutdown
|
public static final int STATE_NONE = 0; // we're doing nothing
|
||||||
public static final int STATE_LISTEN = 1; // now listening for incoming connections
|
public static final int STATE_LISTEN = 1; // now listening for incoming connections
|
||||||
public static final int STATE_CONNECTING = 2; // now initiating an outgoing connection
|
public static final int STATE_CONNECTING = 2; // now initiating an outgoing connection
|
||||||
public static final int STATE_CONNECTED = 3; // now connected to a remote device
|
public static final int STATE_CONNECTED = 3; // now connected to a remote device
|
||||||
@@ -397,10 +397,8 @@ public class BluetoothChatService {
|
|||||||
bytes = mmInStream.read(buffer);
|
bytes = mmInStream.read(buffer);
|
||||||
|
|
||||||
// Send the obtained bytes to the UI Activity
|
// Send the obtained bytes to the UI Activity
|
||||||
mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, bytes, -1, buffer).sendToTarget();
|
mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, bytes, -1, buffer)
|
||||||
|
.sendToTarget();
|
||||||
// Reload the buffer to clear extra bytes from the previous read
|
|
||||||
buffer = new byte[1024];
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Log.e(TAG, "disconnected", e);
|
Log.e(TAG, "disconnected", e);
|
||||||
connectionLost();
|
connectionLost();
|
||||||
@@ -411,18 +409,15 @@ public class BluetoothChatService {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Write to the connected OutStream.
|
* Write to the connected OutStream.
|
||||||
* @param b The bytes to write
|
* @param buffer The bytes to write
|
||||||
*/
|
*/
|
||||||
public void write(byte[] b) {
|
public void write(byte[] buffer) {
|
||||||
try {
|
try {
|
||||||
mmOutStream.write(b);
|
mmOutStream.write(buffer);
|
||||||
|
|
||||||
// Share the sent message back to the UI Activity
|
// Share the sent message back to the UI Activity
|
||||||
Message msg = mHandler.obtainMessage(BluetoothChat.MESSAGE_OUTGOING_STRING);
|
mHandler.obtainMessage(BluetoothChat.MESSAGE_WRITE, -1, -1, buffer)
|
||||||
Bundle bundle = new Bundle();
|
.sendToTarget();
|
||||||
bundle.putByteArray(BluetoothChat.MESSAGE_WRITE, b);
|
|
||||||
msg.setData(bundle);
|
|
||||||
mHandler.sendMessage(msg);
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Log.e(TAG, "Exception during write", e);
|
Log.e(TAG, "Exception during write", e);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user