本系列的文章主要介绍Android设备基于蓝牙通讯实现实时聊天,文章系列主要包括两个部分:android蓝牙的基本操作,Android蓝牙的聊天实现。
本博客资源免费下载:
蓝牙工具:http://download.csdn.net/detail/laozhuxinlu/11752108
蓝牙畅聊:http://download.csdn.net/detail/laozhuxinlu/11752117
首先来看看聊天效果:
通讯聊天实现的这一块的基础是实现设备的连接,就这一快可参见Android蓝牙通讯/蓝牙聊天之基本操作的实现的实现。
聊天的实现首先我们要有一个概念,就是master设备和salve设备的概念,角色的不同,具体的实现也是不同的。
首先我们来看一下Master的客户端建立:
//建立客户端
private class clientThread extends Thread {
@Override
public void run() {
try {
//创建一个Socket连接:只需要服务器在注册时的UUID号
socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
//连接
Message msg1 = new Message();
msg1.obj = "请稍候,正在连接服务器:";
msg1.what = 1;
LinkDetectedHandler.sendMessage(msg1);
socket.connect();
Message msg2 = new Message();
msg2.obj = "已连接";
// + BluetoothMsg.BlueToothAddress;
msg2.what = 1;
LinkDetectedHandler.sendMessage(msg2);
Message msg = new Message();
msg.obj = "已经连接上服务端!可以发送信息。";
msg.what = 1;
LinkDetectedHandler.sendMessage(msg);
//开启定时器
new Thread(new ThreadShow1()).start();
//启动接受数据
mreadThread = new readThread();
mreadThread.start();
// sendMessageHandle("对方已上线");
// //close InputMethodManager
// InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
// imm.hideSoftInputFromWindow(message.getWindowToken(), 0);
}
catch (IOException e)
{
Log.e("connect", "", e);
Message msg = new Message();
msg.obj = "连接服务端异常!断开连接重新试一试。";
msg.what = 1;
LinkDetectedHandler.sendMessage(msg);
Message msg1 = new Message();
msg1.obj = "服务器建立失败,请确认服务器已建立后重建客户端";
msg1.what = 1;
LinkDetectedHandler.sendMessage(msg1);
}
}
};
Master的客户端建立是有一个前提的,这个前提是salve端的服务器必须要建立完毕:
//建立服务器
private class ServerThread extends Thread {
@Override
public void run() {
try {
/* 创建一个蓝牙服务器
* 参数分别:服务器名称、UUID */
mserverSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord("Clay_Server",
UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
Log.i("server", "wait cilent connect...");
Message msg1 = new Message();
msg1.obj = "请稍候,正在等待客户端的连接...";
msg1.what = 1;
LinkDetectedHandler.sendMessage(msg1);
Message msg3 = new Message();
msg3.obj = "通讯已建立,请建立客户端";
msg3.what = 5;
LinkDetectedHandler.sendMessage(msg3);
/* 接受客户端的连接请求 */
socket = mserverSocket.accept();
Log.i("server", "accept success !");
Message msg2 = new Message();
String info2 = "已连接";
msg2.obj = info2;
msg2.what = 1;
LinkDetectedHandler.sendMessage(msg2);
Message msg = new Message();
String info = "客户端已经连接上!可以发送信息。";
msg.obj = info;
msg.what = 1;
LinkDetectedHandler.sendMessage(msg);
//开启定时器
new Thread(new ThreadShow1()).start();
//启动接受数据
mreadThread = new readThread();
mreadThread.start();
} catch (IOException e) {
Message msg = new Message();
msg.obj = "客户端连接异常!断开连接重新试一试。";
msg.what = 1;
LinkDetectedHandler.sendMessage(msg);
Message msg3 = new Message();
msg3.obj = "通讯建立失败,请重建服务器";
msg3.what = 5;
LinkDetectedHandler.sendMessage(msg3);
e.printStackTrace();
}
}
};
在这个基础上,便能实现客户端和服务器的连接实现,完成了连接对接,下面就是数据发送的实现了:
发送数据的实现:
//发送数据
private void sendMessageHandle(String msg)
{
if (socket == null)
{
Toast.makeText(MasterChat2.this, "没有连接", Toast.LENGTH_SHORT).show();
return;
}
try {
OutputStream os = socket.getOutputStream();
os.write(msg.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
if(msg.equals("100101100001")){
msgList.add("正在呼叫对方……");
mAdapter.notifyDataSetChanged();
mListView.setSelection(msgList.size() - 1);
}else
if(msg.equals("010111001010")){
msgList.add("已重建");
mAdapter.notifyDataSetChanged();
mListView.setSelection(msgList.size() - 1);
}else
{
msgList.add("我:"+msg);
mAdapter.notifyDataSetChanged();
mListView.setSelection(msgList.size() - 1);
}
}
接收读取数据的实现//读取数据
//读取数据
private class readThread extends Thread {
@Override
public void run() {
byte[] buffer = new byte[1024];
int bytes;
InputStream mmInStream = null;
try {
mmInStream = socket.getInputStream();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
while (true) {
try {
// Read from the InputStream
if( (bytes = mmInStream.read(buffer)) > 0 )
{
byte[] buf_data = new byte[bytes];
for(int i=0; i
当然,过程中如果想实现设备的notification的实现,可参加以下方式:
//notification
private void notifi(String s){
// 创建一个启动其他Activity的Intent
Intent intent = new Intent(this
, MasterChat2.class);
PendingIntent pi = PendingIntent.getActivity(
this, 0, intent, 0);
Notification notify = new Notification.Builder(this)
// 设置打开该通知,该通知自动消失
.setAutoCancel(true)
// 设置显示在状态栏的通知提示信息
.setTicker("有新消息")
// 设置通知的图标
.setSmallIcon(R.drawable.lovechat)
// 设置通知内容的标题
.setContentTitle("一条新通知")
// 设置通知内容
.setContentText(s)
// // 设置使用系统默认的声音、默认LED灯
// .setDefaults(Notification.DEFAULT_SOUND
// |Notification.DEFAULT_LIGHTS)
// 设置通知的自定义声音
.setSound(Uri.parse("android.resource://org.crazyit.ui/"
+ R.raw.msg))
.setWhen(System.currentTimeMillis())
// 设改通知将要启动程序的Intent
.setContentIntent(pi)
.build();
// 发送通知
nm.notify(NOTIFICATION_ID1, notify);
}
基于以上的方式,便可实现设备间简单的通讯聊天了。相对网络通讯而言,更加稳定快速。