项目涉及蓝牙通信,所以就简单的学了学,下面是自己参考了一些资料后的总结,希望对大家有帮助。
以下是开发中的几个关键步骤:
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()) {
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;
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;
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码