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);    }

   基于以上的方式,便可实现设备间简单的通讯聊天了。相对网络通讯而言,更加稳定快速。





原创粉丝点击