android 蓝牙通信编程

公司项目涉及蓝牙通信,所以就简单的学了学,下面是自己参考了一些资料后的总结,希望对大家有帮助。

以下是开发中的几个关键步骤:

  1. 首先开启蓝牙
  2. 搜索可用设备
  3. 创建蓝牙socket,获取输入输出流
  4. 读取和写入数据
  5. 断开连接关闭蓝牙

下面是一个蓝牙聊天demo

效果图:
这里写图片描述
这里写图片描述

在使用蓝牙是 BluetoothAdapter 对蓝牙开启,关闭,获取设备列表,发现设备,搜索等核心功能
下面对它进行封装:

    package com.xiaoyu.bluetooth;  


    import java.util.ArrayList;  
    import java.util.Iterator;  
    import java.util.List;  
    import java.util.Set;  

    import android.app.Activity;  
    import android.app.AlertDialog;  
    import android.bluetooth.BluetoothAdapter;  
    import android.bluetooth.BluetoothDevice;  
    import android.content.BroadcastReceiver;  
    import android.content.Context;  
    import android.content.DialogInterface;  
    import android.content.Intent;  
    import android.content.IntentFilter;  

    public class BTManage {  

    //  private List<BTItem> mListDeviceBT=null;  
        private BluetoothAdapter mBtAdapter =null;  
        private static BTManage mag=null;  

        private BTManage(){  
    //      mListDeviceBT=new ArrayList<BTItem>();  
            mBtAdapter=BluetoothAdapter.getDefaultAdapter();  
        }  

        public static BTManage getInstance(){  
            if(null==mag)  
                mag=new BTManage();  
            return mag;  
        }  

        private StatusBlueTooth blueStatusLis=null;  
        public void setBlueListner(StatusBlueTooth blueLis){  
            this.blueStatusLis=blueLis;  
        }  

        public BluetoothAdapter getBtAdapter(){  
            return this.mBtAdapter;  
        }  

        public void openBluetooth(Activity activity){  
            if(null==mBtAdapter){   Device does not support Bluetooth   
                AlertDialog.Builder dialog = new AlertDialog.Builder(activity);    
                dialog.setTitle("No bluetooth devices");    
                dialog.setMessage("Your equipment does not support bluetooth, please change device");    

                dialog.setNegativeButton("cancel",    
                        new DialogInterface.OnClickListener() {    
                            @Override    
                            public void onClick(DialogInterface dialog, int which) {    

                            }    
                        });    
                dialog.show();    
                return;  
            }  
            // If BT is not on, request that it be enabled.  
            if (!mBtAdapter.isEnabled()) {  
                /*Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
                activity.startActivityForResult(enableIntent, 3);*/  
                mBtAdapter.enable();  
            }  
        }  

        public void closeBluetooth(){  
            if(mBtAdapter.isEnabled())  
                mBtAdapter.disable();  
        }  

        public boolean isDiscovering(){  
            return mBtAdapter.isDiscovering();  
        }  

        public void scanDevice(){  
    //      mListDeviceBT.clear();  
            if(!mBtAdapter.isDiscovering())  
                mBtAdapter.startDiscovery();  
        }  

        public void cancelScanDevice(){  
            if(mBtAdapter.isDiscovering())  
                mBtAdapter.cancelDiscovery();  
        }  

        public void registerBluetoothReceiver(Context mcontext){  
             // Register for broadcasts when start bluetooth search  
            IntentFilter startSearchFilter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_STARTED);  
            mcontext.registerReceiver(mBlueToothReceiver, startSearchFilter);  
             // Register for broadcasts when a device is discovered  
            IntentFilter discoveryFilter = new IntentFilter(BluetoothDevice.ACTION_FOUND);  
            mcontext.registerReceiver(mBlueToothReceiver, discoveryFilter);  
            // Register for broadcasts when discovery has finished  
            IntentFilter foundFilter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);  
            mcontext.registerReceiver(mBlueToothReceiver, foundFilter);  
        }  

        public void unregisterBluetooth(Context mcontext){  
            cancelScanDevice();  
            mcontext.unregisterReceiver(mBlueToothReceiver);  
        }  

        public List<BTItem> getPairBluetoothItem(){  
            List<BTItem> mBTitemList=null;  
            // Get a set of currently paired devices  
            Set<BluetoothDevice> pairedDevices = mBtAdapter.getBondedDevices();  
            Iterator<BluetoothDevice> it=pairedDevices.iterator();  
            while(it.hasNext()){  
                if(mBTitemList==null)  
                    mBTitemList=new ArrayList<BTItem>();  

                BluetoothDevice device=it.next();  
                BTItem item=new BTItem();  
                item.setBuletoothName(device.getName());  
                item.setBluetoothAddress(device.getAddress());  
                item.setBluetoothType(BluetoothDevice.BOND_BONDED);  
                mBTitemList.add(item);  
            }  
            return mBTitemList;  
        }  


         private final BroadcastReceiver mBlueToothReceiver = new BroadcastReceiver() {  
                @Override  
                public void onReceive(Context context, Intent intent) {  
                    String action = intent.getAction();  
                    if(BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) {  
                        if(blueStatusLis!=null)  
                            blueStatusLis.BTDeviceSearchStatus(StatusBlueTooth.SEARCH_START);  
                    }  
                    else if (BluetoothDevice.ACTION_FOUND.equals(action)){  
                        // When discovery finds a device  
                        // Get the BluetoothDevice object from the Intent  
                        BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);  
                        // If it's already paired, skip it, because it's been listed already  
                        if (device.getBondState() != BluetoothDevice.BOND_BONDED) {  
                            BTItem item=new BTItem();  
                            item.setBuletoothName(device.getName());  
                            item.setBluetoothAddress(device.getAddress());  
                            item.setBluetoothType(device.getBondState());  

                            if(blueStatusLis!=null)  
                                blueStatusLis.BTSearchFindItem(item);  
          //                mListDeviceBT.add(item);  
                        }  
                    }   
                    else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){  
                         // When discovery is finished, change the Activity title  
                        if(blueStatusLis!=null)  
                            blueStatusLis.BTDeviceSearchStatus(StatusBlueTooth.SEARCH_END);  
                    }  
                }  
            };    


    }  

蓝牙开发和socket一致,分为server,client

server功能类封装:

    package com.xiaoyu.bluetooth;  

    import java.io.BufferedInputStream;  
    import java.io.BufferedOutputStream;  
    import java.io.EOFException;  
    import java.io.IOException;  
    import java.util.UUID;  

    import com.xiaoyu.utils.ThreadPool;  

    import android.bluetooth.BluetoothAdapter;  
    import android.bluetooth.BluetoothServerSocket;  
    import android.bluetooth.BluetoothSocket;  
    import android.os.Handler;  
    import android.os.Message;  

    public class BTServer {  

        /* 一些常量,代表服务器的名称 */  
        public static final String PROTOCOL_SCHEME_L2CAP = "btl2cap";  
        public static final String PROTOCOL_SCHEME_RFCOMM = "btspp";  
        public static final String PROTOCOL_SCHEME_BT_OBEX = "btgoep";  
        public static final String PROTOCOL_SCHEME_TCP_OBEX = "tcpobex";  

        private BluetoothServerSocket btServerSocket = null;  
        private BluetoothSocket btsocket = null;  
        private BluetoothAdapter mBtAdapter =null;  
        private BufferedInputStream bis=null;  
        private BufferedOutputStream bos=null;  

        private Handler detectedHandler=null;  

        public BTServer(BluetoothAdapter mBtAdapter,Handler detectedHandler){  
            this.mBtAdapter=mBtAdapter;  
            this.detectedHandler=detectedHandler;  
        }  

        public void startBTServer() {  
            ThreadPool.getInstance().excuteTask(new Runnable() {  
                public void run() {  
                    try {  
                        btServerSocket = mBtAdapter.listenUsingRfcommWithServiceRecord(PROTOCOL_SCHEME_RFCOMM,  
                        UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));  

                        Message msg = new Message();    
                        msg.obj = "请稍候,正在等待客户端的连接...";    
                        msg.what = 0;    
                        detectedHandler.sendMessage(msg);    

                        btsocket=btServerSocket.accept();  
                        Message msg2 = new Message();    
                        String info = "客户端已经连接上!可以发送信息。";    
                        msg2.obj = info;    
                        msg.what = 0;    
                        detectedHandler.sendMessage(msg2);    

                        receiverMessageTask();  
                    } catch(EOFException e){  
                        Message msg = new Message();    
                        msg.obj = "client has close!";    
                        msg.what = 1;    
                        detectedHandler.sendMessage(msg);  
                    }catch (IOException e) {  
                        e.printStackTrace();  
                        Message msg = new Message();    
                        msg.obj = "receiver message error! please make client try again connect!";    
                        msg.what = 1;    
                        detectedHandler.sendMessage(msg);  
                    }  
                }  
            });  
        }  

        private void receiverMessageTask(){  
            ThreadPool.getInstance().excuteTask(new Runnable() {  
                public void run() {  
                    byte[] buffer = new byte[2048];  
                    int totalRead;  
                    /*InputStream input = null; 
                    OutputStream output=null;*/  
                    try {  
                        bis=new BufferedInputStream(btsocket.getInputStream());  
                        bos=new BufferedOutputStream(btsocket.getOutputStream());  
                    } catch (IOException e) {  
                        e.printStackTrace();  
                    }  

                    try {  
                    //  ByteArrayOutputStream arrayOutput=null;  
                        while((totalRead = bis.read(buffer)) > 0 ){  
                    //       arrayOutput=new ByteArrayOutputStream();  
                            String txt = new String(buffer, 0, totalRead, "UTF-8");   
                            Message msg = new Message();    
                            msg.obj = txt;    
                            msg.what = 1;    
                            detectedHandler.sendMessage(msg);    
                        }  
                    } catch (IOException e) {  
                        e.printStackTrace();  
                    }  
                }  
            });  
        }  

        public boolean sendmsg(String msg){  
            boolean result=false;  
            if(null==btsocket||bos==null)  
                return false;  
            try {  
                bos.write(msg.getBytes());  
                bos.flush();  
                result=true;  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
            return result;  
        }  

        public void closeBTServer(){  
            try{  
            if(bis!=null)  
                bis.close();  
            if(bos!=null)  
                bos.close();  
            if(btServerSocket!=null)  
                btServerSocket.close();  
            if(btsocket!=null)  
                btsocket.close();  
            }catch(IOException e){  
                e.printStackTrace();  
            }  
        }  

    }  

client功能封装:

    package com.xiaoyu.bluetooth;  

    import java.io.BufferedInputStream;  
    import java.io.BufferedOutputStream;  
    import java.io.EOFException;  
    import java.io.IOException;  
    import java.util.UUID;  

    import android.bluetooth.BluetoothAdapter;  
    import android.bluetooth.BluetoothDevice;  
    import android.bluetooth.BluetoothSocket;  
    import android.os.Handler;  
    import android.os.Message;  
    import android.util.Log;  

    import com.xiaoyu.utils.ThreadPool;  

    public class BTClient {  

        final String Tag=getClass().getSimpleName();  
        private BluetoothSocket btsocket = null;  
        private BluetoothDevice btdevice = null;  
        private BufferedInputStream bis=null;  
        private BufferedOutputStream bos=null;  
        private BluetoothAdapter mBtAdapter =null;  

        private Handler detectedHandler=null;  

        public BTClient(BluetoothAdapter mBtAdapter,Handler detectedHandler){  
            this.mBtAdapter=mBtAdapter;  
            this.detectedHandler=detectedHandler;  
        }  

        public void connectBTServer(String address){  
            //check address is correct  
            if(BluetoothAdapter.checkBluetoothAddress(address)){  
                btdevice = mBtAdapter.getRemoteDevice(address);   
                    ThreadPool.getInstance().excuteTask(new Runnable() {  
                        public void run() {  
                            try {  
                                btsocket = btdevice.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));  

                                Message msg2 = new Message();    
                                msg2.obj = "请稍候,正在连接服务器:"+BluetoothMsg.BlueToothAddress;    
                                msg2.what = 0;    
                                detectedHandler.sendMessage(msg2);    

                                btsocket.connect();   
                                Message msg = new Message();    
                                msg.obj = "已经连接上服务端!可以发送信息。";    
                                msg.what = 0;    
                                detectedHandler.sendMessage(msg);    
                                receiverMessageTask();  
                            } catch (IOException e) {  
                                e.printStackTrace();  
                                Log.e(Tag, e.getMessage());  

                                 Message msg = new Message();    
                                 msg.obj = "连接服务端异常!请检查服务器是否正常,断开连接重新试一试。";    
                                 msg.what = 0;    
                                detectedHandler.sendMessage(msg);  
                            }  

                        }  
                    });  
                }  
        }  

        private void receiverMessageTask(){  
            ThreadPool.getInstance().excuteTask(new Runnable() {  
                public void run() {  
                    byte[] buffer = new byte[2048];  
                    int totalRead;  
                    /*InputStream input = null; 
                    OutputStream output=null;*/  
                    try {  
                        bis=new BufferedInputStream(btsocket.getInputStream());  
                        bos=new BufferedOutputStream(btsocket.getOutputStream());  
                    } catch (IOException e) {  
                        e.printStackTrace();  
                    }  

                    try {  
                    //  ByteArrayOutputStream arrayOutput=null;  
                        while((totalRead = bis.read(buffer)) > 0 ){  
                    //       arrayOutput=new ByteArrayOutputStream();  
                            String txt = new String(buffer, 0, totalRead, "UTF-8");   
                            Message msg = new Message();    
                            msg.obj = "Receiver: "+txt;    
                            msg.what = 1;    
                            detectedHandler.sendMessage(msg);    
                        }  
                    } catch(EOFException e){  
                        Message msg = new Message();    
                        msg.obj = "server has close!";    
                        msg.what = 1;    
                        detectedHandler.sendMessage(msg);  
                    }catch (IOException e) {  
                        e.printStackTrace();  
                        Message msg = new Message();    
                        msg.obj = "receiver message error! make sure server is ok,and try again connect!";    
                        msg.what = 1;    
                        detectedHandler.sendMessage(msg);  
                    }  
                }  
            });  
        }  

        public boolean sendmsg(String msg){  
            boolean result=false;  
            if(null==btsocket||bos==null)  
                return false;  
            try {  
                bos.write(msg.getBytes());  
                bos.flush();  
                result=true;  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
            return result;  
        }  

        public void closeBTClient(){  
            try{  
                if(bis!=null)  
                    bis.close();  
                if(bos!=null)  
                    bos.close();  
                if(btsocket!=null)  
                    btsocket.close();  
            }catch(IOException e){  
                e.printStackTrace();  
            }  
        }  

    }  

聊天界面,使用上面分装好的类,处理信息

    package com.xiaoyu.communication;  


    import java.util.ArrayList;  
    import java.util.List;  

    import android.app.Activity;  
    import android.content.Context;  
    import android.content.Intent;  
    import android.os.Bundle;  
    import android.os.Handler;  
    import android.os.Message;  
    import android.text.TextUtils;  
    import android.view.Menu;  
    import android.view.View;  
    import android.view.View.OnClickListener;  
    import android.view.inputmethod.InputMethodManager;  
    import android.widget.ArrayAdapter;  
    import android.widget.Button;  
    import android.widget.EditText;  
    import android.widget.ListView;  
    import android.widget.RadioGroup;  
    import android.widget.RadioGroup.OnCheckedChangeListener;  
    import android.widget.Toast;  

    import com.xiaoyu.bluetooth.BTClient;  
    import com.xiaoyu.bluetooth.BTManage;  
    import com.xiaoyu.bluetooth.BTServer;  
    import com.xiaoyu.bluetooth.BluetoothMsg;  

    public class BTChatActivity extends Activity {  

        private ListView mListView;    
        private Button sendButton;    
        private Button disconnectButton;    
        private EditText editMsgView;    
        private ArrayAdapter<String> mAdapter;    
        private List<String> msgList=new ArrayList<String>();  

        private BTClient client;  
        private BTServer server;  

        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.bt_chat);  
            initView();  

        }  

        private Handler detectedHandler = new Handler(){  
            public void handleMessage(android.os.Message msg) {  
                msgList.add(msg.obj.toString());    
                 mAdapter.notifyDataSetChanged();    
                 mListView.setSelection(msgList.size() - 1);    
            };  
        };  

         private void initView() {              

             mAdapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, msgList);    
             mListView = (ListView) findViewById(R.id.list);    
             mListView.setAdapter(mAdapter);    
             mListView.setFastScrollEnabled(true);    
             editMsgView= (EditText)findViewById(R.id.MessageText);      
             editMsgView.clearFocus();    

             RadioGroup group = (RadioGroup)this.findViewById(R.id.radioGroup);  
             group.setOnCheckedChangeListener(new OnCheckedChangeListener() {  
    //             @Override  
    //             public void onCheckedChanged(RadioGroup arg0, int arg1) {  
    //                 int radioId = arg0.getCheckedRadioButtonId();  
    //                  
    //             }  
                 @Override  
                public void onCheckedChanged(RadioGroup group, int checkedId) {  
                    switch(checkedId){  
                    case R.id.radioNone:  
                        BluetoothMsg.serviceOrCilent = BluetoothMsg.ServerOrCilent.NONE;  
                        if(null!=client){  
                            client.closeBTClient();  
                            client=null;  
                        }  
                        if(null!=server){  
                            server.closeBTServer();  
                            server=null;  
                        }  
                        break;  
                    case R.id.radioClient:  
                        BluetoothMsg.serviceOrCilent = BluetoothMsg.ServerOrCilent.CILENT;  
                        Intent it=new Intent(getApplicationContext(),BTDeviceActivity.class);    
                        startActivityForResult(it, 100);  
                        break;  
                    case R.id.radioServer:  
                        BluetoothMsg.serviceOrCilent = BluetoothMsg.ServerOrCilent.SERVICE;  
                        initConnecter();  
                        break;  
                    }  
                }  
             });  

             sendButton= (Button)findViewById(R.id.btn_msg_send);    
             sendButton.setOnClickListener(new OnClickListener() {    
                 @Override    
                 public void onClick(View arg0) {    

                     String msgText =editMsgView.getText().toString();    
                     if (msgText.length()>0) {    
                         if (BluetoothMsg.serviceOrCilent == BluetoothMsg.ServerOrCilent.CILENT){    
                             if(null==client)  
                                 return;  
                             if(client.sendmsg(msgText)){  
                                 Message msg = new Message();    
                                 msg.obj = "send: "+msgText;    
                                 msg.what = 1;    
                                 detectedHandler.sendMessage(msg);   
                             }else{  
                                 Message msg = new Message();    
                                 msg.obj = "send fail!! ";    
                                 msg.what = 1;    
                                 detectedHandler.sendMessage(msg);   
                             }  
                          }    
                          else if (BluetoothMsg.serviceOrCilent == BluetoothMsg.ServerOrCilent.SERVICE) {    
                              if(null==server)  
                                 return;  
                              if(server.sendmsg(msgText)){  
                                 Message msg = new Message();    
                                  msg.obj = "send: "+msgText;    
                                  msg.what = 1;    
                                  detectedHandler.sendMessage(msg);   
                              }else{  
                                 Message msg = new Message();    
                                  msg.obj = "send fail!! ";    
                                  msg.what = 1;    
                                  detectedHandler.sendMessage(msg);   
                              }  
                          }      
                         editMsgView.setText("");    
    //                     editMsgView.clearFocus();    
    //                     //close InputMethodManager    
    //                     InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);     
    //                     imm.hideSoftInputFromWindow(editMsgView.getWindowToken(), 0);    
                     }else{    
                         Toast.makeText(getApplicationContext(), "发送内容不能为空!", Toast.LENGTH_SHORT).show();  
                     }  
                 }    
             });    

             disconnectButton= (Button)findViewById(R.id.btn_disconnect);    
             disconnectButton.setOnClickListener(new OnClickListener() {    
                 @Override    
                 public void onClick(View arg0) {    
                     if (BluetoothMsg.serviceOrCilent == BluetoothMsg.ServerOrCilent.CILENT){    
                         if(null==client)  
                             return;  
                        client.closeBTClient();  
                     }    
                     else if (BluetoothMsg.serviceOrCilent == BluetoothMsg.ServerOrCilent.SERVICE) {   
                         if(null==server)  
                             return;  
                         server.closeBTServer();  
                     }    
                     BluetoothMsg.isOpen = false;    
                     BluetoothMsg.serviceOrCilent=BluetoothMsg.ServerOrCilent.NONE;    
                     Toast.makeText(getApplicationContext(), "已断开连接!", Toast.LENGTH_SHORT).show();    
                 }    
             });         
         }        

         @Override  
        protected void onResume() {  
            super.onResume();  

            if (BluetoothMsg.isOpen) {  
                Toast.makeText(getApplicationContext(), "连接已经打开,可以通信。如果要再建立连接,请先断开!",  
                        Toast.LENGTH_SHORT).show();  
            }  
        }  

         @Override  
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
            super.onActivityResult(requestCode, resultCode, data);  
            if(requestCode==100){  
                //从设备列表返回  
                initConnecter();  
            }  
        }  

        private void initConnecter(){  
            if (BluetoothMsg.serviceOrCilent == BluetoothMsg.ServerOrCilent.CILENT) {  
                String address = BluetoothMsg.BlueToothAddress;  
                if (!TextUtils.isEmpty(address)) {  
                    if(null==client)  
                        client=new BTClient(BTManage.getInstance().getBtAdapter(), detectedHandler);  
                    client.connectBTServer(address);  
                    BluetoothMsg.isOpen = true;  
                } else {  
                    Toast.makeText(getApplicationContext(), "address is empty please choose server address !",  
                            Toast.LENGTH_SHORT).show();  
                }  
            } else if (BluetoothMsg.serviceOrCilent == BluetoothMsg.ServerOrCilent.SERVICE) {  
                if(null==server)  
                    server=new BTServer(BTManage.getInstance().getBtAdapter(), detectedHandler);  
                server.startBTServer();  
                BluetoothMsg.isOpen = true;  
            }  
        }  

        @Override  
        public boolean onCreateOptionsMenu(Menu menu) {  
            // Inflate the menu; this adds items to the action bar if it is present.  
            getMenuInflater().inflate(R.menu.main, menu);  
            return true;  
        }  

    }  

client搜索设备列表,连接选择server界面:


    package com.xiaoyu.communication;  

    import java.util.ArrayList;  
    import java.util.List;  

    import android.app.Activity;  
    import android.app.AlertDialog;  
    import android.content.DialogInterface;  
    import android.content.Intent;  
    import android.os.Bundle;  
    import android.view.View;  
    import android.widget.AdapterView;  
    import android.widget.AdapterView.OnItemClickListener;  
    import android.widget.ArrayAdapter;  
    import android.widget.Button;  
    import android.widget.ListView;  

    import com.xiaoyu.bluetooth.BTItem;  
    import com.xiaoyu.bluetooth.BTManage;  
    import com.xiaoyu.bluetooth.BluetoothMsg;  
    import com.xiaoyu.bluetooth.StatusBlueTooth;  

    public class BTDeviceActivity extends Activity implements OnItemClickListener  
                        ,View.OnClickListener ,StatusBlueTooth{    

    //  private List<BTItem> mListDeviceBT=new ArrayList<BTItem>();  
        private ListView deviceListview;    
        private Button btserch;    
        private BTDeviceAdapter adapter;    
        private boolean hasregister=false;    

        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.finddevice);  
            setView();  

            BTManage.getInstance().setBlueListner(this);  
        }  

         private void setView(){    
                deviceListview=(ListView)findViewById(R.id.devicelist);    
                deviceListview.setOnItemClickListener(this);  
                adapter=new BTDeviceAdapter(getApplicationContext());    
                deviceListview.setAdapter(adapter);    
                deviceListview.setOnItemClickListener(this);    
                btserch=(Button)findViewById(R.id.start_seach);    
                btserch.setOnClickListener(this);   
        }    

        @Override  
        protected void onStart() {  
            super.onStart();  
            //注册蓝牙接收广播    
            if(!hasregister){    
                hasregister=true;    
                BTManage.getInstance().registerBluetoothReceiver(getApplicationContext());  
            }     
        }  

        @Override  
        protected void onResume() {  
            // TODO Auto-generated method stub  
            super.onResume();  
        }  

        @Override  
        protected void onPause() {  
            // TODO Auto-generated method stub  
            super.onPause();  
        }  

        @Override  
        protected void onStop() {  
            super.onStop();  
            if(hasregister){    
                hasregister=false;    
                BTManage.getInstance().unregisterBluetooth(getApplicationContext());    
            }    
        }  

        @Override  
        protected void onDestroy() {  
            super.onDestroy();  

        }  

        @Override  
        public void onItemClick(AdapterView<?> parent, View view, int position,  
                long id) {  

            final BTItem item=(BTItem)adapter.getItem(position);  


            AlertDialog.Builder dialog = new AlertDialog.Builder(this);// 定义一个弹出框对象    
            dialog.setTitle("Confirmed connecting device");    
            dialog.setMessage(item.getBuletoothName());    
            dialog.setPositiveButton("connect",    
                    new DialogInterface.OnClickListener() {    
                        @Override    
                        public void onClick(DialogInterface dialog, int which) {    
                        //  btserch.setText("repeat search");  
                            BTManage.getInstance().cancelScanDevice();  
                            BluetoothMsg.BlueToothAddress=item.getBluetoothAddress();   

                            if(BluetoothMsg.lastblueToothAddress!=BluetoothMsg.BlueToothAddress){    
                                BluetoothMsg.lastblueToothAddress=BluetoothMsg.BlueToothAddress;    
                            }    
                           setResult(100);  
                           finish();  
                        }    
                    });    
            dialog.setNegativeButton("cancel",    
                    new DialogInterface.OnClickListener() {    
                        @Override    
                        public void onClick(DialogInterface dialog, int which) {    
                            BluetoothMsg.BlueToothAddress = null;    
                        }    
                    });    
            dialog.show();    
        }  

        @Override  
        public void onClick(View v) {  
            BTManage.getInstance().openBluetooth(this);  

            if(BTManage.getInstance().isDiscovering()){    
                BTManage.getInstance().cancelScanDevice();    
                btserch.setText("start search");    
            }else{    
                BTManage.getInstance().scanDevice();   
                btserch.setText("stop search");    
            }    
        }  

        @Override  
        public void BTDeviceSearchStatus(int resultCode) {  
            switch(resultCode){  
            case StatusBlueTooth.SEARCH_START:  
                adapter.clearData();  
                adapter.addDataModel(BTManage.getInstance().getPairBluetoothItem());  
                break;  
            case StatusBlueTooth.SEARCH_END:  
                break;  
            }  
        }  

        @Override  
        public void BTSearchFindItem(BTItem item) {  
            adapter.addDataModel(item);  
        }  

        @Override  
        public void BTConnectStatus(int result) {  

        }  

    }  

搜索列表adapter:


    package com.xiaoyu.communication;  

    import java.util.ArrayList;  
    import java.util.List;  

    import android.content.Context;  
    import android.view.LayoutInflater;  
    import android.view.View;  
    import android.view.ViewGroup;  
    import android.widget.BaseAdapter;  
    import android.widget.TextView;  

    import com.xiaoyu.bluetooth.BTItem;  

    public class BTDeviceAdapter extends BaseAdapter{  


        private List<BTItem> mListItem=new ArrayList<BTItem>();;  
        private Context mcontext=null;  
        private LayoutInflater mInflater=null;  

        public BTDeviceAdapter(Context context){  
            this.mcontext=context;  
        //  this.mListItem=mListItem;  
            this.mInflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  

        }  

        void clearData(){  
            mListItem.clear();  
        }  

        void addDataModel(List<BTItem> itemList){  
            if(itemList==null || itemList.size()==0)  
                return;  
            mListItem.addAll(itemList);  
            notifyDataSetChanged();  
        }  
        void addDataModel(BTItem item){  
            mListItem.add(item);  
            notifyDataSetChanged();  
        }  

        @Override  
        public int getCount() {  

            return mListItem.size();  
        }  

        @Override  
        public Object getItem(int position) {  

            return mListItem.get(position);  
        }  

        @Override  
        public long getItemId(int position) {  

            return position;  
        }  

        @Override  
        public View getView(int position, View convertView, ViewGroup parent) {  
            ViewHolder holder=null;  

            if(convertView==null){  
                holder=new ViewHolder();  
                convertView = mInflater.inflate(R.layout.device_item_row, null);  
                holder.tv=(TextView)convertView.findViewById(R.id.itemText);  
                convertView.setTag(holder);  
            }else{  
                holder=(ViewHolder)convertView.getTag();  
            }  


            holder.tv.setText(mListItem.get(position).getBuletoothName());  
            return convertView;  
        }  


         class ViewHolder{  
             TextView tv;  
         }  

    }  

列表model:


    package com.xiaoyu.bluetooth;  

    public class BTItem {  

        private String buletoothName=null;  
        private String bluetoothAddress=null;  
        private int bluetoothType=-1;  

        public String getBuletoothName() {  
            return buletoothName;  
        }  
        public void setBuletoothName(String buletoothName) {  
            this.buletoothName = buletoothName;  
        }  
        public String getBluetoothAddress() {  
            return bluetoothAddress;  
        }  
        public void setBluetoothAddress(String bluetoothAddress) {  
            this.bluetoothAddress = bluetoothAddress;  
        }  
        public int getBluetoothType() {  
            return bluetoothType;  
        }  
        public void setBluetoothType(int bluetoothType) {  
            this.bluetoothType = bluetoothType;  
        }  


    }  

使用到的辅助类:


    package com.xiaoyu.bluetooth;  

    public class BluetoothMsg {  

        public enum ServerOrCilent{    
            NONE,    
            SERVICE,    
            CILENT    
        };    
        //蓝牙连接方式    
        public static ServerOrCilent serviceOrCilent = ServerOrCilent.NONE;    
        //连接蓝牙地址    
        public static String BlueToothAddress = null,lastblueToothAddress=null;    
        //通信线程是否开启    
        public static boolean isOpen = false;   
    }  

    package com.xiaoyu.bluetooth;  

    public interface StatusBlueTooth {  

        final static int SEARCH_START=110;  
        final static int SEARCH_END=112;  

        final static int serverCreateSuccess=211;  
        final static int serverCreateFail=212;  
        final static int clientCreateSuccess=221;  
        final static int clientCreateFail=222;  
        final static int connectLose=231;  

        void BTDeviceSearchStatus(int resultCode);  
        void BTSearchFindItem(BTItem item);  
        void BTConnectStatus(int result);  

    }  

    package com.xiaoyu.utils;  

    import java.util.concurrent.LinkedBlockingQueue;  
    import java.util.concurrent.ThreadFactory;  
    import java.util.concurrent.ThreadPoolExecutor;  
    import java.util.concurrent.TimeUnit;  
    import java.util.concurrent.atomic.AtomicBoolean;  
    import java.util.concurrent.atomic.AtomicInteger;  

    public class ThreadPool {  

         private AtomicBoolean mStopped = new AtomicBoolean(Boolean.FALSE);    
         private ThreadPoolExecutor mQueue;    
         private final int coreSize=2;  
         private final int maxSize=10;  
         private final int timeOut=2;  
         private static ThreadPool pool=null;  

            private ThreadPool() {    
                mQueue = new ThreadPoolExecutor(coreSize, maxSize, timeOut, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), sThreadFactory);    
            //    mQueue.allowCoreThreadTimeOut(true);    
            }    

          public static ThreadPool getInstance(){  
              if(null==pool)  
                  pool=new ThreadPool();  
              return pool;  
          }  

            public void excuteTask(Runnable run) {    
                mQueue.execute(run);    
            }    

            public void closeThreadPool() {    
                if (!mStopped.get()) {    
                    mQueue.shutdownNow();    
                    mStopped.set(Boolean.TRUE);    
                }    
            }    

            private static final ThreadFactory sThreadFactory = new ThreadFactory() {    
                private final AtomicInteger mCount = new AtomicInteger(1);    

                @Override    
                public Thread newThread(Runnable r) {    
                    return new Thread(r, "ThreadPool #" + mCount.getAndIncrement());    
                }    
            };    

    }  

最后别忘了加入权限


    <uses-permission android:name="android.permission.BLUETOOTH"/>  
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />  
    <uses-permission android:name="android.permission.READ_CONTACTS"/>  

在编程中遇到的问题:
Exception: Unable to start Service Discovery
java.io.IOException: Unable to start Service Discovery错误

1,必须保证客户端,服务器端中的UUID统一,客户端格式为:UUID格式一般是”xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”

例如:UUID.fromString(“81403000-13df-b000-7cf4-350b4a2110ee”);

2,必须进行配对处理后方可能够连接

扩展:蓝牙后台配对实现(网上看到的整理如下)

    static public boolean createBond(Class btClass, BluetoothDevice btDevice)  
                throws Exception {  
            Method createBondMethod = btClass.getMethod("createBond");  
            Log.i("life", "createBondMethod = " + createBondMethod.getName());  
            Boolean returnValue = (Boolean) createBondMethod.invoke(btDevice);  
            return returnValue.booleanValue();  
        }  

        static public boolean setPin(Class btClass, BluetoothDevice btDevice,  
                String str) throws Exception {  
            Boolean returnValue = null;  
            try {  
                Method removeBondMethod = btClass.getDeclaredMethod("setPin",  
                        new Class[] { byte[].class });  
                returnValue = (Boolean) removeBondMethod.invoke(btDevice,  
                        new Object[] { str.getBytes() });  
                Log.i("life", "returnValue = " + returnValue);  
            } catch (SecurityException e) {  
                // throw new RuntimeException(e.getMessage());  
                e.printStackTrace();  
            } catch (IllegalArgumentException e) {  
                // throw new RuntimeException(e.getMessage());  
                e.printStackTrace();  
            } catch (Exception e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
            return returnValue;  
        }  

        // 取消用户输入  
        static public boolean cancelPairingUserInput(Class btClass,  
                BluetoothDevice device) throws Exception {  
            Method createBondMethod = btClass.getMethod("cancelPairingUserInput");  
            // cancelBondProcess()  
            Boolean returnValue = (Boolean) createBondMethod.invoke(device);  
            Log.i("life", "cancelPairingUserInputreturnValue = " + returnValue);  
            return returnValue.booleanValue();  
        }  
public class ClsUtils {

    public ClsUtils() {
        // TODO Auto-generated constructor stub
    }
     /** 
     * 与设备配对 参考源码:platform/packages/apps/Settings.git 
     * /Settings/src/com/android/settings/bluetooth/CachedBluetoothDevice.java 
     */  
    static public boolean createBond(Class btClass, BluetoothDevice btDevice)  
    throws Exception  
    {  

        Method createBondMethod = btClass.getMethod("createBond");  
        Boolean returnValue = (Boolean) createBondMethod.invoke(btDevice);  
        return returnValue.booleanValue();  
    }  

    /** 
     * 与设备解除配对 参考源码:platform/packages/apps/Settings.git 
     * /Settings/src/com/android/settings/bluetooth/CachedBluetoothDevice.java 
     */  
    static public boolean removeBond(Class btClass, BluetoothDevice btDevice)  
            throws Exception  
    {  
        Method removeBondMethod = btClass.getMethod("removeBond");  
        Boolean returnValue = (Boolean) removeBondMethod.invoke(btDevice);  
        return returnValue.booleanValue();  
    }  

    static public boolean setPin(Class btClass, BluetoothDevice btDevice,  
            String str) throws Exception  
    {  
        try  
        {  
            Method removeBondMethod = btClass.getDeclaredMethod("setPin",  
                    new Class[]  
                    {byte[].class});  
            Boolean returnValue = (Boolean) removeBondMethod.invoke(btDevice,  
                    new Object[]  
                    {str.getBytes()});  
            Log.e("returnValue设置密码", "" + returnValue.booleanValue());  
            return returnValue.booleanValue();  
        }  
        catch (SecurityException e)  
        {  
            // throw new RuntimeException(e.getMessage());  
            e.printStackTrace();  
        }  
        catch (IllegalArgumentException e)  
        {  
            // throw new RuntimeException(e.getMessage());  
            e.printStackTrace();  
        }  
        catch (Exception e)  
        {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
        return false;  

    }  

    // 取消用户输入  
    static public boolean cancelPairingUserInput(Class btClass,  
            BluetoothDevice device)  
    throws Exception  
    {  
        Method createBondMethod = btClass.getMethod("cancelPairingUserInput");  
        cancelBondProcess(btClass,device) ; 
        Boolean returnValue = (Boolean) createBondMethod.invoke(device);  
        Log.i("取消对话框","cancelPairingUserInput"+returnValue.booleanValue());
        return returnValue.booleanValue();  
    }  

    // 取消配对  
    static public boolean cancelBondProcess(Class btClass,  
            BluetoothDevice device)  

    throws Exception  
    {  
        Method createBondMethod = btClass.getMethod("cancelBondProcess");  
        Boolean returnValue = (Boolean) createBondMethod.invoke(device);  
        return returnValue.booleanValue();  
    }  

    /** 
     * 
     * @param clsShow 
     */  
    static public void printAllInform(Class clsShow)  
    {  
        try  
        {  
            // 取得所有方法  
            Method[] hideMethod = clsShow.getMethods();  
            int i = 0;  
            for (; i < hideMethod.length; i++)  
            {  
                Log.e("method name", hideMethod[i].getName() + ";and the i is:"  
                        + i);  
            }  
            // 取得所有常量  
            Field[] allFields = clsShow.getFields();  
            for (i = 0; i < allFields.length; i++)  
            {  
                Log.e("Field name", allFields[i].getName());  
            }  
        }  
        catch (SecurityException e)  
        {  
            // throw new RuntimeException(e.getMessage());  
            e.printStackTrace();  
        }  
        catch (IllegalArgumentException e)  
        {  
            // throw new RuntimeException(e.getMessage());  
            e.printStackTrace();  
        }  
        catch (Exception e)  
        {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
    }  


    static public boolean pair(String strAddr, String strPsw)  
    {  
        boolean result = false;  
        BluetoothAdapter bluetoothAdapter = BluetoothAdapter  
                .getDefaultAdapter();  

        bluetoothAdapter.cancelDiscovery();  

        if (!bluetoothAdapter.isEnabled())  
        {  
            bluetoothAdapter.enable();  
        }  



        BluetoothDevice device = bluetoothAdapter.getRemoteDevice(strAddr);  

        if (device.getBondState() != BluetoothDevice.BOND_BONDED)  
        {  
            try  
            {  
                Log.d("mylog", "NOT BOND_BONDED");  
                boolean flag1=ClsUtils.setPin(device.getClass(), device, strPsw); // 手机和蓝牙采集器配对  
                boolean flag2=ClsUtils.createBond(device.getClass(), device);  
//                remoteDevice = device; // 配对完毕就把这个设备对象传给全局的remoteDevice 

                     result = true;  


            }  
            catch (Exception e)  
            {  
                // TODO Auto-generated catch block  

                Log.d("mylog", "setPiN failed!");  
                e.printStackTrace();  
            } //  

        }  
        else  
        {  
            Log.d("mylog", "HAS BOND_BONDED");  
            try  
            {  
                ClsUtils.removeBond(device.getClass(), device);
                //ClsUtils.createBond(device.getClass(), device);  
               boolean flag1= ClsUtils.setPin(device.getClass(), device, strPsw); // 手机和蓝牙采集器配对  
                boolean flag2=ClsUtils.createBond(device.getClass(), device);  
//                remoteDevice = device; // 如果绑定成功,就直接把这个设备对象传给全局的remoteDevice 

                 result = true;  


            }  
            catch (Exception e)  
            {  
                // TODO Auto-generated catch block  
                Log.d("mylog", "setPiN failed!");  
                e.printStackTrace();  
            }  
        }  
        return result;  
    }  

}
蓝牙配对的关键代码:

 flag3= ClsUtils.createBond(device.getClass(), device);


其中device是蓝牙设备。在配对的时候会有一个配对广播,可以自定义一个广播接受者获取配对广播,然后在这个广播接收者里设置pin值,取消确定对话框,实现自动配对。关键代码如下:

mReceiver=new ParingReceiver(device);
                             IntentFilter filter=new IntentFilter();
                             filter.addAction( BluetoothDevice.ACTION_PAIRING_REQUEST);
                             filter.setPriority(Integer.MAX_VALUE);
                             registerReceiver(mReceiver, filter);

然后监听蓝牙配对的广播 匹配“Android.bluetooth.device.action.PAIRING_REQUEST”这个action
然后调用上面的setPin(mDevice.getClass(), mDevice, “1234”); // 手机和蓝牙采集器配对
createBond(mDevice.getClass(), mDevice);
cancelPairingUserInput(mDevice.getClass(), mDevice);
mDevice是你要去连接的那个蓝牙的对象 , 1234为配对的pin码

转自:http://blog.csdn.net/yudajun/article/details/8362916

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值