关闭

android 蓝牙通信编程

1047人阅读 评论(1) 收藏 举报
分类:

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

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

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

1,首先开启蓝牙

2,搜索可用设备

3,创建蓝牙socket,获取输入输出流

4,读取和写入数据

5,断开连接关闭蓝牙


下面是一个蓝牙聊天demo

效果图:



2015-09-20更新(主要对蓝牙按照功能进行封装,增加程序可读性,可移植)

在使用蓝牙是 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();
	}


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


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    风色年代——不只是技术!

    有问题?欢迎到公众号下留言^ ^
    个人资料
    • 访问:1578246次
    • 积分:16264
    • 等级:
    • 排名:第679名
    • 原创:44篇
    • 转载:570篇
    • 译文:4篇
    • 评论:206条
    公告
    本博收藏大部分文章为转载,并在文章开头给出了原创作者及原文出处,如有再转,敬请保留相关信息,这是大家对原创作者劳动成果的自觉尊重!!
    早期遗留的部分文章未能及时给出相关原创信息,在此谨致歉意,后续会尽全力予以纠正。如为您带来不便,请于本博下留言,谢谢配合。