zoukankan      html  css  js  c++  java
  • android蓝牙实现简单的聊天的功能

    蓝牙打开的两种方式:一种是有对话框弹出,另一种是没有对话框。

              通過意图打开
                   Intent open = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
                    //只是打開時間,单位秒
                    open.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,300);
                    startActivity(open);
              //静默打开 (没有对话框)
                    BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
                    adapter.enable();

    关闭蓝牙

    // 关闭蓝牙
                    BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
                    adapter.disable();

    扫描蓝牙设备:扫描的有两种结果一种是已经配对过的,另外一种就是周围有的设备

        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
                    adapter.startDiscovery();//开始扫描蓝牙设备
        //返回已经配对过的设备
                    Set<BluetoothDevice> bondedDevices = adapter.getBondedDevices();

    扫描周围的设备需要注册广播,在oncreate方法里

    //注册找到设备广播
            IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);  
            registerReceiver(mReceiver, filter);  
            //注册完成扫描广播
            filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);  
            registerReceiver(mReceiver, filter);
    //回掉广播
        BroadcastReceiver mReceiver = new BroadcastReceiver() {  
            public void onReceive(Context context, Intent intent) {  
                String action = intent.getAction();  
                //找到设备  
                if (BluetoothDevice.ACTION_FOUND.equals(action)) {  
                    BluetoothDevice device = intent  
                            .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);  
          
                   // if (device.getBondState() != BluetoothDevice.BOND_BONDED) {  
          
                    Log.d("mytag",device.getName());
                    Bean bean = new Bean();
                    bean.setAddress(device.getAddress());
                    bean.setName(device.getName());
                    list.add(bean);
                    Myadapter.notifyDataSetChanged();
                   
                    //}  
                }  
                //搜索完成  
                else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED  
                        .equals(action)) {  
                    setTitle("搜索完成");  
    //                if (mNewDevicesAdapter.getCount() == 0) {  
    //                    Log.v("tag", "find over");  
    //                }  
                }  
            }  
        };  

    然后是让一个手机作为服务器,得分为以下步骤,

    这里需要注意的是需要一个唯一的uuid,两端必须保持一致

    1,开启子线程等待客户端接入,

    2,接入成功开启接收聊天的子线程,

    3,发送时开启发送子线程

    package com.example.bluetooth;
    
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.io.PrintStream;
    import java.util.UUID;
    
    import android.support.v7.app.ActionBarActivity;
    import android.bluetooth.BluetoothAdapter;
    import android.bluetooth.BluetoothServerSocket;
    import android.bluetooth.BluetoothSocket;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    
    public class ServerActivity extends ActionBarActivity {
        private TextView tv;
        private Button send;
        private EditText input;
    
        private BluetoothAdapter adapter; // 蓝牙适配器
        private BluetoothServerSocket serverSocket; // 服务器socket
        private BluetoothSocket socker; // 客户端socket
    
        PrintStream out;
        BufferedReader in;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_server);
            tv = (TextView) findViewById(R.id.sstate);
            send = (Button) findViewById(R.id.ssend);
            input = (EditText) findViewById(R.id.sinput);
            //发送按钮
            send.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    new Thread(new Runnable() {
                        
                        @Override
                        public void run() {
                            out.println(input.getText().toString());
                            out.flush();
                            handle.sendEmptyMessage(2);
                            
                        }
                    }).start();
                }
            });
            init();
        }
    
        // 创建蓝牙服务器端
        private void init() {
            tv.setText("服务器已经启动,正在等待链接。。。
    ");
            new Thread(new Runnable() {
    
                @Override
                public void run() {
                    // 获得适配器
                    adapter = BluetoothAdapter.getDefaultAdapter();
    
                    try {
                        //uuid作为链接标识
                        serverSocket = adapter.listenUsingRfcommWithServiceRecord(
                                "test", UUID.fromString("3F2504E0-4F89-11D3-9A0C-0305E82C3301"));
                        //等待客户端连接
                        socker = serverSocket.accept();
                        if(socker!=null){
                            //获得输入输出流,向客户端输入输出信息
                            in = new BufferedReader(new InputStreamReader(socker.getInputStream()));
                            out = new PrintStream(socker.getOutputStream());
                        }
                        handle.sendEmptyMessage(0);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
    
                }
            }).start();
        }
        private Handler handle = new Handler(){
            public void handleMessage(android.os.Message msg) {
                switch (msg.what) {
                //成功
                case 0:
                    tv.append("链接成功
    ");
                    new Thread(new ReadInfoThread()).start();
                    break;
                case 1:
                    String m = (String) msg.obj;
                    tv.append(m+"
    ");
                    break;
                case 2:
                    input.setText("");
                    break;
    
                default:
                    break;
                }
            };
        };
    //    boolean isTrue = true;
        class ReadInfoThread implements Runnable{
            String info = "";
            @Override
            public void run() {
                while (true) {
                    try {
                        info = in.readLine();
                        Message msg = handle.obtainMessage();
                        msg.what = 1;
                        msg.obj = info;
                        handle.sendMessage(msg);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                
            }
            
        }
        @Override
        protected void onStop() {
            // TODO Auto-generated method stub
            super.onStop();
            try {
                if(socker!=null)
                socker.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    客户端和服务器差不多的逻辑

    package com.example.bluetooth;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintStream;
    import java.util.UUID;
    
    import android.support.v7.app.ActionBarActivity;
    import android.annotation.SuppressLint;
    import android.bluetooth.BluetoothAdapter;
    import android.bluetooth.BluetoothDevice;
    import android.bluetooth.BluetoothSocket;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    
    public class ClitenActivity extends ActionBarActivity {
        private TextView tv;
        private Button send;
        private EditText input;
    
        private BluetoothAdapter adapter; // 蓝牙适配器
        private BluetoothDevice device;
        private BluetoothSocket socker; // 客户端socket
    
        PrintStream out;
        BufferedReader in;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_cliten);
            initView();
            init();
        }
    
        private void init() {
            tv.setText("正在与服务器进行连接...
    ");
            new Thread(new Runnable() {
    
                @SuppressLint("NewApi")
                @Override
                public void run() {
                    try {
                        adapter = BluetoothAdapter.getDefaultAdapter();
                        device = adapter.getRemoteDevice(getIntent().getStringExtra(
                                "address"));
                        socker = device.createInsecureRfcommSocketToServiceRecord(UUID
                                .fromString("3F2504E0-4F89-11D3-9A0C-0305E82C3301"));
                        if(socker!=null){
                            socker.connect();    
                            //获得输入输出流,想客户端输入输出信息
                            in = new BufferedReader(new InputStreamReader(socker.getInputStream()));
                            out = new PrintStream(socker.getOutputStream());
                        }
                        handle.sendEmptyMessage(0);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
    
                }
            }).start();
    
        }
    
        private void initView() {
            tv = (TextView) findViewById(R.id.state);
            send = (Button) findViewById(R.id.send);
            input = (EditText) findViewById(R.id.input);
            send.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View v) {
    
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            out.println(input.getText().toString());
                            out.flush();
                            handle.sendEmptyMessage(2);
                        }
                    }).start();
                
                    
                }
            });
        }
        private Handler handle = new Handler(){
            public void handleMessage(android.os.Message msg) {
                switch (msg.what) {
                case 0:
                    tv.append("链接成功");
                    new Thread(new Runnable() {
                        String info = "";
                        @Override
                        public void run() {
                            while (true) {
                                try {
                                    info = in.readLine();
                                    System.out.println("收到"+info);
                                    Message msg = handle.obtainMessage();
                                    msg.what = 1;
                                    msg.obj = info;
                                    handle.sendMessage(msg);
                                } catch (IOException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }
                            }
                            
                        }
                    }).start();
                    break;
                case 1:
                    String m = (String) msg.obj;
                    tv.append(m+"
    ");
                    break;
                case 2:
                    input.setText("");
                    break;
    
                default:
                    break;
                }
            };
        };
        
        class ReadInfoThread implements Runnable{
            String info = "";
            @Override
            public void run() {
                while (true) {
                    try {
                        info = in.readLine();
                        System.out.println("收到"+info);
                        Message msg = handle.obtainMessage();
                        msg.what = 1;
                        msg.obj = info;
                        handle.sendMessage(msg);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                
            }
            
        }
        @Override
        protected void onStop() {
            // TODO Auto-generated method stub
            super.onStop();
            try {
                if(socker!=null)
                socker.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    主界面逻辑代码

    package com.example.bluetooth;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Set;
    
    import android.support.v7.app.ActionBarActivity;
    import android.annotation.SuppressLint;
    import android.bluetooth.BluetoothAdapter;
    import android.bluetooth.BluetoothAdapter.LeScanCallback;
    import android.bluetooth.BluetoothDevice;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.ListView;
    
    public class MainActivity extends ActionBarActivity {
        private List<Bean> list = new ArrayList<Bean>();
        private ListView lv;
        private MyAdapter Myadapter;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //注册找到设备广播
            IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);  
            registerReceiver(mReceiver, filter);  
            //注册完成扫描广播
            filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);  
            registerReceiver(mReceiver, filter);
            
            lv = (ListView) findViewById(R.id.lv);
            Myadapter = new MyAdapter(this, list);
            lv.setAdapter(Myadapter);
            lv.setOnItemClickListener(new OnItemClickListener() {
    
                @Override
                public void onItemClick(AdapterView<?> parent, View view,
                        int position, long id) {
                    Intent intent = new Intent(MainActivity.this,ClitenActivity.class);
                    intent.putExtra("address",list.get(position).getAddress());
                    startActivity(intent);
                }
            });
            findViewById(R.id.button4).setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this,ServerActivity.class);
                    startActivity(intent);
                    
                }
            });
            findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View v) {
                    //打開
                /*    
                 * 通過意图打开
                 * Intent open = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
                    //只是打開時間
                    open.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,300);
                    startActivity(open);*/
                    
                    //静默打开 (没有对话框)
                    BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
                    adapter.enable();
                }
            });
            findViewById(R.id.button2).setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View v) {
                    // 关闭蓝牙
                    BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
                    adapter.disable();
                    
                }
            });
            findViewById(R.id.button3).setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
                    adapter.startDiscovery();//开始扫描蓝牙设备
                    Bean bean;
                    //返回已经配对过的设备
                    Set<BluetoothDevice> bondedDevices = adapter.getBondedDevices();
                    for (BluetoothDevice bluetoothDevice : bondedDevices) {
                        bean = new Bean();
                        bean.setName("已经配对"+bluetoothDevice.getName());
                        bean.setAddress(bluetoothDevice.getAddress());
                        list.add(bean);
                    }
                    Myadapter.notifyDataSetChanged();
                
                }
            });
        }
        @Override
        protected void onDestroy() {
            super.onDestroy();
            unregisterReceiver(mReceiver);
        };
        //回掉广播
        BroadcastReceiver mReceiver = new BroadcastReceiver() {  
            public void onReceive(Context context, Intent intent) {  
                String action = intent.getAction();  
                //找到设备  
                if (BluetoothDevice.ACTION_FOUND.equals(action)) {  
                    BluetoothDevice device = intent  
                            .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);  
          
                   // if (device.getBondState() != BluetoothDevice.BOND_BONDED) {  
          
                    Log.d("mytag",device.getName());
                    Bean bean = new Bean();
                    bean.setAddress(device.getAddress());
                    bean.setName(device.getName());
                    list.add(bean);
                    Myadapter.notifyDataSetChanged();
                   
                    //}  
                }  
                //搜索完成  
                else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED  
                        .equals(action)) {  
                    setTitle("搜索完成");  
    //                if (mNewDevicesAdapter.getCount() == 0) {  
    //                    Log.v("tag", "find over");  
    //                }  
                }  
            }  
        };  
    }
  • 相关阅读:
    WebGL学习笔记(一)
    svn和ftp的不同应用场合
    Java 开源博客 Solo 1.8.0 发布
    【C解毒】滥用变量
    【C解毒】答非所问
    【C解毒】错题无解
    【C解毒】怎样写main()函数
    程序员约架事件中,薛非到底是因为不会用Github还是不会写Tokenizer而没有应战?
    『一些同学学不好C语言,把罪责归于「因为教材是谭浩强写的」实在是很滑稽』吗?
    挂羊头卖狗肉蓄意欺骗读者——谭浩强《C程序设计(第四版)》中所谓的“按照C99”(二)
  • 原文地址:https://www.cnblogs.com/84126858jmz/p/5408819.html
Copyright © 2011-2022 走看看