Android蓝牙通讯/蓝牙聊天的实现(二)_含demo下载
来源:互联网 发布:天尚网络电视机顶盒 编辑:程序博客网 时间:2024/06/05 10:58
Android蓝牙通讯/蓝牙聊天之聊天通讯的实现
本系列的文章主要介绍Android设备基于蓝牙通讯实现实时聊天,文章系列主要包括两个部分:android蓝牙的基本操作,Android蓝牙的聊天实现。
本博客资源免费下载:
蓝牙工具:http://download.csdn.net/detail/laozhuxinlu/9870880
蓝牙畅聊:http://download.csdn.net/detail/laozhuxinlu/9870878首先来看看聊天效果:
通讯聊天实现的这一块的基础是实现设备的连接,就这一快可参见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<bytes; i++) { buf_data[i] = buffer[i]; } String s = new String(buf_data); if(s.equals("100101100001")){ Message msg = new Message(); String info = "对方正在呼叫您……"; msg.obj = info; msg.what = 0; LinkDetectedHandler.sendMessage(msg); Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE); Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification); r.play(); }else if(s.equals("010111001010")){ shutdownClient(); Message msg = new Message(); msg.obj = "已断开"; msg.what = 2; LinkDetectedHandler.sendMessage(msg); //关闭定时器(终结其他线程的方法)实现错误// new Thread(new ThreadShow1()).stop(); }else if(s.equals("101011001001")){ Message msg1 = new Message(); msg1.obj = "服务器已退出,请先建立服务器"; msg1.what = 5; LinkDetectedHandler.sendMessage(msg1); //关闭定时器// new Thread(new ThreadShow1()).stop(); }else {// notifi(s); //在状态栏点击有bug Message msg = new Message(); msg.obj = "他:"+s; msg.what = 0; LinkDetectedHandler.sendMessage(msg); Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification); r.play(); } } } catch (IOException e) { try { mmInStream.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } break; } } } };
当然,过程中如果想实现设备的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); }
基于以上的方式,便可实现设备间简单的通讯聊天了。相对网络通讯而言,更加稳定快速。
阅读全文
0 0
- Android蓝牙通讯/蓝牙聊天的实现(二)_含demo下载
- Android蓝牙通讯/蓝牙聊天的实现(一)_含demo下载
- Android蓝牙聊天,蓝牙通讯
- Android基于蓝牙的聊天demo
- Android基于蓝牙的聊天demo
- Android平台蓝牙编程之蓝牙聊天分析(二)
- Android蓝牙通讯(三)————蓝牙通讯的实现
- Android蓝牙基础(3)-实现蓝牙聊天
- Android 蓝牙聊天程序的实现
- Android蓝牙通讯(二)————蓝牙的相关操作
- 两个Android端基于蓝牙通讯的demo
- android 蓝牙通讯实现手机蓝牙的开启,并扫描附近可见的蓝牙设备
- 微信小程序蓝牙通讯蓝牙模块demo
- 微信小程序蓝牙通讯蓝牙模块demo
- Android 蓝牙开发实例--蓝牙聊天程序的设计和实现
- Android 蓝牙开发实例--蓝牙聊天程序的设计和实现
- Android 蓝牙开发实例--蓝牙聊天程序的设计和实现
- Android 蓝牙开发实例--蓝牙聊天程序的设计和实现
- ios返回上一页不好用且一直在刷新
- 斜率优化+单调队列优化DP<转>
- Android PopupWindow使用
- 配置私有maven服务器管理android项目依赖
- Windows线程(二)
- Android蓝牙通讯/蓝牙聊天的实现(二)_含demo下载
- searchView-风格调整
- ==和equals的区别
- 操作系统概念(高等教育出版社,第七版)复习——第六章:进程同步
- 图片轮询
- 笨方法学python笔记(1)
- ant-contrib扩展包的使用
- C# 文件夹拷贝
- CONVT_NO_NUMBER