Java 向其他蓝牙设备发送文本消息时获取StringIndexOutOfBoundsException
我正在开发一个android应用程序,需要通过蓝牙发送文本。我已经想出了一段代码来实现这一点。我的问题是,它在向抛出StringIndexOutOfBoundsException的设备发送消息后崩溃。如何修复此问题。我的完整代码是:Java 向其他蓝牙设备发送文本消息时获取StringIndexOutOfBoundsException,java,android,bluetooth,Java,Android,Bluetooth,我正在开发一个android应用程序,需要通过蓝牙发送文本。我已经想出了一段代码来实现这一点。我的问题是,它在向抛出StringIndexOutOfBoundsException的设备发送消息后崩溃。如何修复此问题。我的完整代码是: package com.example.blueremote; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.uti
package com.example.blueremote;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.UUID;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity {
private BluetoothAdapter btadapter;
private BluetoothSocket socket;
private Button btnSend;
private ArrayList<BluetoothDevice> foundDevices;
private ArrayAdapter<BluetoothDevice> aa;
private Handler handler = new Handler();
private ListView list;
private TextView tvmsg;
private static int DISCOVERY_REQUEST = 1;
private UUID uuid = UUID.fromString("a60f35f0-b93a-11de-8a39-08002009c666");
ImageButton up;
private String address = "D8:50:E6:8A:16:0F";
private String text = "up";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btadapter = BluetoothAdapter.getDefaultAdapter();
Intent disc;
disc = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
startActivityForResult(disc, DISCOVERY_REQUEST);
up = (ImageButton) findViewById(R.id.btn_up);
registerReceiver(discoveryResult, new IntentFilter(
BluetoothDevice.ACTION_FOUND));
AsyncTask<Integer, Void, Void> connectTask = new AsyncTask<Integer, Void, Void>() {
@Override
protected Void doInBackground(Integer... params) {
// TODO Auto-generated method stub
try {
Log.v("Main Activity", " AsyncTask started");
BluetoothDevice device = btadapter.getRemoteDevice(address);
socket = device.createRfcommSocketToServiceRecord(uuid);
Log.v("Main Activity", "Socket Created");
socket.connect();
Log.v("Main Activity", "Socket Connected");
} catch (IOException e) {
Log.d("BLUETOOTH_CLIENT", e.getMessage());
}
return null;
}
@Override
protected void onPostExecute(Void result) {
// Log.v("Main Activity", "Invoking switchUI");
// switchUI();
}
};
connectTask.execute();
up.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Log.v("Main Activity", "In up Button");
// Log.v("Main Activity", "Invoking switchUI");
switchUI();
}
});
}
private void switchUI() {
Log.v("Main Activity", "In SwitchUI Method");
Log.v("Main Activity", "Invoking sendMessage Method ");
sendMessage(socket, text);
Log.v("Main Activity", "Message Sent");
BluetoothSocketListener bsl = new BluetoothSocketListener(socket,
handler);
Thread messageListener = new Thread(bsl);
messageListener.start();
}
private void sendMessage(BluetoothSocket socket, String msg) {
msg = "UP";
OutputStream outStream;
try {
Log.v("Main Activity", "Inside sendMessage Method ");
outStream = socket.getOutputStream();
Log.v("Main Activity", "Outstream:" + outStream);
byte[] byteString = (msg + " ").getBytes();
Log.v("Main Activity", "byteString:" + byteString);
outStream.write(byteString);
Log.v("Main Activity", "outstream written:");
} catch (IOException e) {
Log.d("BLUETOOTH_COMMS", e.getMessage());
}
}
private class MessagePoster implements Runnable {
private TextView textView;
private String message;
public MessagePoster(String message) {
// this.textView = textView;
this.message = message;
}
public void run() {
// textView.setText(message);
}
}
private class BluetoothSocketListener implements Runnable {
private BluetoothSocket socket;
private TextView textView;
private Handler handler;
public BluetoothSocketListener(BluetoothSocket socket, Handler handler) {
this.socket = socket;
// this.textView = textView;
this.handler = handler;
}
public void run() {
int bufferSize = 2048;
byte[] buffer = new byte[bufferSize];
try {
InputStream instream = socket.getInputStream();
int bytesRead = -1;
String message = "";
while (true) {
message = "";
bytesRead = instream.read(buffer);
if (bytesRead != -1) {
while ((bytesRead == bufferSize)
&& (buffer[bufferSize - 1] != 0)) {
message = message
+ new String(buffer, 0, bytesRead);
bytesRead = instream.read(buffer);
}
message = message
+ new String(buffer, 0, bytesRead - 1);
handler.post(new MessagePoster(message));
socket.getInputStream();
}
}
} catch (IOException e) {
Log.d("BLUETOOTH_COMMS", e.getMessage());
}
}
}
BroadcastReceiver discoveryResult = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
BluetoothDevice remoteDevice;
remoteDevice = intent
.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (btadapter.getBondedDevices().contains(remoteDevice)) {
foundDevices.add(remoteDevice);
aa.notifyDataSetChanged();
}
}
};
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(discoveryResult);
}
}
package com.example.blueremote;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.OutputStream;
导入java.util.ArrayList;
导入java.util.UUID;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.os.Handler;
导入android.app.Activity;
导入android.bluetooth.BluetoothAdapter;
导入android.bluetooth.bluetooth设备;
导入android.bluetooth.BluetoothServerSocket;
导入android.bluetooth.BluetoothSocket;
导入android.content.BroadcastReceiver;
导入android.content.Context;
导入android.content.Intent;
导入android.content.IntentFilter;
导入android.util.Log;
导入android.view.Menu;
导入android.view.view;
导入android.widget.ArrayAdapter;
导入android.widget.Button;
导入android.widget.EditText;
导入android.widget.ImageButton;
导入android.widget.ListView;
导入android.widget.TextView;
公共类MainActivity扩展了活动{
私人蓝牙适配器;
私人蓝牙插座;
私人按钮btnSend;
专用ArrayList设备;
私人阵列适配器aa;
私有处理程序=新处理程序();
私有列表视图列表;
私有文本视图TVMG;
私有静态int发现_请求=1;
专用UUID UUID=UUID.fromString(“a60f35f0-b93a-11de-8a39-08002009c666”);
图像按钮;
专用字符串地址=“D8:50:E6:8A:16:0F”;
私有字符串text=“up”;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btadapter=BluetoothAdapter.getDefaultAdapter();
意向盘;
disc=新意图(BluetoothAdapter.ACTION\u REQUEST\u DISCOVERABLE);
startActivityForResult(光盘、发现请求);
向上=(ImageButton)findViewById(R.id.btn\u向上);
registerReceiver(发现结果、新意向过滤器(
BluetoothDevice.ACTION_发现);
AsyncTask connectTask=新建AsyncTask(){
@凌驾
受保护的Void doInBackground(整数…参数){
//TODO自动生成的方法存根
试一试{
Log.v(“主活动”,“异步任务已启动”);
BluetoothDevice=btadapter.getRemoteDevice(地址);
socket=device.createrFComSocketToServiceRecord(uuid);
Log.v(“主要活动”、“创建套接字”);
socket.connect();
Log.v(“主要活动”、“插座连接”);
}捕获(IOE异常){
Log.d(“BLUETOOTH_客户端”,例如getMessage());
}
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
//Log.v(“主要活动”、“调用switchUI”);
//switchUI();
}
};
connectTask.execute();
setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
Log.v(“主活动”、“向上按钮”);
//Log.v(“主要活动”、“调用switchUI”);
switchUI();
}
});
}
私有void switchUI(){
Log.v(“主要活动”,“在SwitchUI方法中”);
Log.v(“主活动”,“调用sendMessage方法”);
发送消息(套接字、文本);
Log.v(“主要活动”、“发送的消息”);
BluetoothSocketListener bsl=新的BluetoothSocketListener(套接字,
经办人);
Thread messageListener=新线程(bsl);
messageListener.start();
}
私有void发送消息(BluetoothSocket套接字,字符串消息){
msg=“向上”;
输出流外流;
试一试{
Log.v(“主要活动”、“内部发送消息方法”);
outStream=socket.getOutputStream();
日志v(“主要活动”,“扩展:+扩展”);
byte[]byteString=(msg+“”)。getBytes();
Log.v(“主要活动”,“byteString:+byteString”);
exptream.write(通过testring);
Log.v(“主要活动”,“外扩写:”);
}捕获(IOE异常){
Log.d(“蓝牙通信”,例如getMessage());
}
}
私有类MessagePoster实现可运行{
私有文本视图文本视图;
私有字符串消息;
公共消息海报(字符串消息){
//this.textView=textView;
this.message=消息;
}
公开募捐{
//textView.setText(消息);
}
}
私有类BluetoothSocketListener实现可运行{
私人蓝牙插座;
私有文本视图文本视图;
私人经办人;
公共BluetoothSocketListener(BluetoothSocket套接字,处理程序){
this.socket=socket;
//this.textView=textView;
this.handler=handler;
}
公开募捐{
int bufferSize=2048;
字节[]缓冲区=新字节[bufferSize];
试一试{
InputStream instream=socket.getInputStream();
int字节读取=-1;
字符串消息=”;
while(true){
message=“”;
bytesRead=流内读取(缓冲区);
如果(字节读取!=-1){
while((bytesRead==bufferSize)
&&(缓冲区[bufferSize-1]!=0)){
E/AndroidRuntime(10360): FATAL EXCEPTION: Thread-1585
E/AndroidRuntime(10360): java.lang.StringIndexOutOfBoundsException: length=2048; regionStart=0; regionLength=65534
E/AndroidRuntime(10360): at java.lang.String.failedBoundsCheck(String.java:587)
E/AndroidRuntime(10360): at java.lang.String.<init>(String.java:247)
E/AndroidRuntime(10360): at java.lang.String.<init>(String.java:171)
E/AndroidRuntime(10360): at com.example.blueremote.MainActivity$BluetoothSocketListener.run(MainActivity.java:177)