这是老师布置的第六个安卓开发实验作业。
主要内容是在类微信程序的第一子项中完成“蓝牙聊天功能”。微信程序是之前的实验作业,此次作业是在之前作业的基础上做的。
通过老师提供的代码参考网址代码参考网址和参考同学的博客,磕磕碰碰的完成了此次作业。
首先通过上课内容和查阅资料了解到这个小Demo的原理图,帮助理解代码。
下面给出部分主要功能函数的代码。
1、初始化功能函数
/*
* 初始化
* */
public void init()
{
mAdapter = BluetoothAdapter.getDefaultAdapter();//获取蓝牙适配器
//判断设备是否支持蓝牙
if(mAdapter == null)
{
//告诉用户设备不支持蓝牙,然后退出
showAlertDialog("退出应用","抱歉!该设备不支持蓝牙。 ", "", "确定", 0);
}
//初始化控件
tv_dev = (TextView) findViewById(R.id.tv_dev); //得到本机蓝牙设备名称显示句柄
tv_dev.setText("本机蓝牙名称:"+mAdapter.getName()+"("+mAdapter.getAddress()+")");//显示本机蓝牙设备名称
tv_reDev = (TextView) findViewById(R.id.tv_reDev);//得到其他蓝牙设备名称显示句柄
tv_rmsg = (TextView) findViewById(R.id.in); //得到数据显示句柄
sv = (ScrollView)findViewById(R.id.sv_list); //得到翻页句柄(有滚动条)
edt_smsg = (EditText)findViewById(R.id.edt_smsg); //得到输入框句柄
btn_cnnt = (Button)findViewById(R.id.btn_cnnt);//得到"连接"按钮
btn_send_file = (Button)findViewById(R.id.btn_send_file);//得到"发送文件"按钮
}
2、发送和响应功能函数
/*
* "发送"按钮单击事件
*/
public void onSendButtonClicked(View v)
{
if(!mAdapter.isEnabled())//如果还没有开启蓝牙服务
{
showToast("蓝牙服务不可用!!");
return ;
}
if(cs_flag == 0)//未连接蓝牙设备!
{
showToast("未连接蓝牙设备!");
return ;
}
//获取要发送的信息
String smsg = edt_smsg.getText().toString();
if(smsg.equals(""))//如果消息为空则不发送
{
return ;
}
edt_smsg.setText("");//清空信息输入框
//发送消息
if(cs_flag == 1)//本机作为服务器
{
accept_thread.write(smsg);
}
else if(cs_flag == 2)//本机作为客户端
{
connect_thread.write(smsg);
}
}
/*
* 接收活动结果,响应startActivityForResult()
* @param requestCode:请求码(自定义一个 整数,代表要请求什么操作)
* @param resultCode:结果码(自定义一个 整数,代表请求的处理结果,表示成功与否。。。)
* @param data:页面返回的数据
*/
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
switch(requestCode)
{
case REQUEST_BT_ENABLE_CODE://请求开启蓝牙界面返回 (系统自带的请求打开蓝牙界面)
if (resultCode == RESULT_OK)
{
//用户允许打开蓝牙(蓝牙开启需要一定的时间)
showToast("蓝牙已开启");
//开启服务线程
accept_thread = new AcceptThread();
accept_thread.start();
} else if (resultCode == RESULT_CANCELED) {
//用户没有允许打开蓝牙,退出应用
showAlertDialog("退出应用", "抱歉!应用需要开启蓝牙!", "" ,"确认", 0) ;
}
break;
case REQUEST_CONNECT_DEVICE://搜索周边蓝牙设备界面结果返回
// 响应返回结果
if (resultCode == Activity.RESULT_OK) //连接成功
{
//1 获取要连接设备的名称、MAC地址
//String dev_name = data.getExtras().getString(DeviceListActivity.EXTRA_DEVICE_NAME);
String address = data.getExtras().getString(DeviceListActivity.EXTRA_DEVICE_ADDRESS);
//2 得到要连接的蓝牙设备句柄
mRemoteDev = mAdapter.getRemoteDevice(address);
if(mRemoteDev == null)
{
tv_rmsg.append("获取蓝牙设备句柄失败\n");
return;
}
//3 开启连接线程
if(connect_thread != null)//取消之前的
{
connect_thread.close();//结束线程
connect_thread = null;
}
connect_thread = new ConnectThread(mRemoteDev);
connect_thread.start();
}
break;
default:break;
}
}
3、连接客户端功能
//Connect客户端线程
class ConnectThread extends Thread
{
private BluetoothDevice mDevice;//要连接的蓝牙设备
private InputStream btIs; //用来获取其他蓝牙设备发来的消息
private OutputStream btOs; //用来发送消息给其他蓝牙设备
private boolean thread_run; //用来控制循环(如果是true则线程一直在运行)
public ConnectThread(BluetoothDevice device) {
mDevice = device;//被点击选中的蓝牙设备
thread_run = true;
}
@Override
public void run() {
if (mDevice != null) {
try {
try
{
if(mSocket != null)
{
mSocket.close();
mSocket = null;
}
}
catch(Exception e)
{}
//1 获取套接字
mSocket = mDevice.createInsecureRfcommSocketToServiceRecord(UUID.fromString(MY_UUID));
if (mSocket == null)
{
sendHandlerMsg("cnnt获取mSocket失败\n", 100);
return;
}
try
{
//2 发起连接请求
mSocket.connect();
//弹出提示框
sendHandlerMsg("连接 " + mDevice.getName() + " 成功!", 1);
//在TextView上显示已经连接上的蓝牙设备名称
sendHandlerMsg("已连接:"+mDevice.getName()+"("+mDevice.getAddress()+")", 3);
sendHandlerMsg("-----已连接:"+mDevice.getName()+"("+mDevice.getAddress()+") -----\n", 9);
cs_flag = 2;//标识本机作为客户端
sendHandlerMsg("断开", 4);//将"连接"按钮文本改为断开
//3 获取输入输出流
btIs = mSocket.getInputStream();
btOs = mSocket.getOutputStream();
//4 通讯-接收消息
BufferedReader reader = new BufferedReader(new InputStreamReader(btIs, "UTF-8"));
String content = null;
thread_run = true;
while (thread_run)
{
content = reader.readLine();
if(content.startsWith("__DISCONNECT__") )//收到服务器端的断开信息
{
sendHandlerMsg("收到消息:" + "断开连接" + "\n", 9);
break;
}
else if(content !="" && !content.isEmpty())
{
sendHandlerMsg("收到消息:" + content + "\n", 9);
content = "";
}
}
}catch(Exception e){}
cs_flag = 0;
sendHandlerMsg("断开连接", 1);
sendHandlerMsg("未连接蓝牙设备", 3);
sendHandlerMsg("----已断开连接----" +"\n", 9);//将消息显示到TextView
sendHandlerMsg("连接", 4);//将"断开"按钮文本改为"连接"
} catch (IOException e) {
e.printStackTrace();
sendHandlerMsg("cnnt错误:" + e.getMessage(), 100);
}
finally
{
if(mSocket != null)
{
try {
mSocket.close();
mSocket = null;
} catch (IOException e) {}
}
}
}
}
//发送信息
public void write(String msg)
{
sendMsg(btOs, msg);
}
//结束线程
public void close()
{
thread_run = false;
try {
mSocket.close();
} catch (IOException e) {}
}
}
最后附上源码地址(代码是通过老师上课的视频、网上的代码、同学的代码参考拼凑出来的,感谢这些参考来源!)