Android蓝牙通信编程

作者:gf771115 时间:2023-06-24 04:37:48 

项目涉及蓝牙通信,所以就简单的学了学,下面是自己参考了一些资料后的总结,希望对大家有帮助。
 以下是开发中的几个关键步骤:
1、首先开启蓝牙 
2、搜索可用设备 
3、创建蓝牙socket,获取输入输出流 
4、读取和写入数据
5、断开连接关闭蓝牙 

下面是一个蓝牙聊天demo 
效果图: 

Android蓝牙通信编程

在使用蓝牙是 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码

标签:Android,蓝牙,通信
0
投稿

猜你喜欢

  • android获取手机唯一标识的方法

    2022-09-16 15:55:39
  • c#测试反射性能示例

    2021-12-19 23:13:47
  • Java日期时间操作的方法

    2021-12-27 18:36:05
  • Java中弱引用和软引用的区别以及虚引用和强引用介绍

    2023-01-23 18:55:33
  • SpringMVC Json自定义序列化和反序列化的操作方法

    2022-11-15 13:07:49
  • Android性能优化之RecyclerView分页加载组件功能详解

    2023-06-04 16:24:14
  • 操作xml,将xml数据显示到treeview的C#代码

    2023-01-02 19:56:48
  • 浅谈spring中scope作用域

    2022-08-18 10:42:53
  • Android唤醒、解锁屏幕代码实例

    2022-09-03 14:11:51
  • android水平循环滚动控件使用详解

    2023-07-24 15:25:34
  • Java Map接口及其实现类原理解析

    2022-06-04 22:54:29
  • mybatis postgresql 批量删除操作方法

    2021-07-19 17:13:56
  • android绘制圆形图片的两种方式示例

    2021-10-11 13:17:28
  • C#版Tesseract库的使用技巧

    2023-01-24 20:07:53
  • Spring Boot中@Conditional注解介绍

    2022-03-03 15:23:37
  • Android权限操作之uses-permission详解

    2023-07-20 17:07:02
  • C#获取指定目录下指定文件的方法

    2022-11-01 12:34:27
  • Java9的一些新特性介绍

    2022-03-29 04:13:58
  • c#根据网址抓取网页截屏生成图片的示例

    2021-08-31 14:29:13
  • C#抓取当前屏幕并保存为图片的方法

    2023-09-27 08:39:43
  • asp之家 软件编程 m.aspxhome.com