android:
id="@+id/lvDevices"
android:
layout_width="match_parent"
android:
layout_height="0dp"
android:
layout_weight="1"/>
2.实现步骤
1.声明
我们需要的东西
//本地蓝牙适配器
privateBluetoothAdaptermBluetoothAdapter;
//列表
privateListViewlvDevices;
//存储搜索到的蓝牙
privateListbluetoothDevices=newArrayList();
//listview的adapter
privateArrayAdapterarrayAdapter;
//UUID.randomUUID()随机获取UUID
privatefinalUUIDMY_UUID=UUID
.fromString("db764ac8-4b08-7f25-aafe-59d03c27bae3");
//连接对象的名称
privatefinalStringNAME="LGL";
//这里本身即是服务端也是客户端,需要如下类
privateBluetoothSocketclientSocket;
privateBluetoothDevicedevice;
//输出流_客户端需要往服务端输出
privateOutputStreamos;
2.初始化
//获取本地蓝牙适配器
mBluetoothAdapter=BluetoothAdapter.getDefaultAdapter();
//判断手机是否支持蓝牙
if(mBluetoothAdapter==null){
Toast.makeText(this,"设备不支持蓝牙",Toast.LENGTH_SHORT).show();
finish();
}
//判断是否打开蓝牙
if(!
mBluetoothAdapter.isEnabled()){
//弹出对话框提示用户是后打开
Intentintent=newIntent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(intent,1);
//不做提示,强行打开
//mBluetoothAdapter.enable();
}
//初始化listview
lvDevices=(ListView)findViewById(R.id.lvDevices);
lvDevices.setOnItemClickListener(this);
//获取已经配对的设备
SetpairedDevices=mBluetoothAdapter
.getBondedDevices();
//判断是否有配对过的设备
if(pairedDevices.size()>0){
for(BluetoothDevicedevice:
pairedDevices){
//遍历到列表中
bluetoothDevices.add(device.getName()+":
"
+device.getAddress()+"\n");
}
}
//adapter
arrayAdapter=newArrayAdapter(this,
android.R.layout.simple_list_item_1,android.R.id.text1,
bluetoothDevices);
lvDevices.setAdapter(arrayAdapter);
/**
*异步搜索蓝牙设备——广播接收
*/
//找到设备的广播
IntentFilterfilter=newIntentFilter(BluetoothDevice.ACTION_FOUND);
//注册广播
registerReceiver(receiver,filter);
//搜索完成的广播
filter=newIntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
//注册广播
registerReceiver(receiver,filter);
}
3.点击搜索
publicvoidbtnSearch(Viewv){
//设置进度条
setProgressBarIndeterminateVisibility(true);
setTitle("正在搜索...");
//判断是否在搜索,如果在搜索,就取消搜索
if(mBluetoothAdapter.isDiscovering()){
mBluetoothAdapter.cancelDiscovery();
}
//开始搜索
mBluetoothAdapter.startDiscovery();
}
4.搜索设备
privatefinalBroadcastReceiverreceiver=newBroadcastReceiver(){
@Override
publicvoidonReceive(Contextcontext,Intentintent){
//收到的广播类型
Stringaction=intent.getAction();
//发现设备的广播
if(BluetoothDevice.ACTION_FOUND.equals(action)){
//从intent中获取设备
BluetoothDevicedevice=intent
.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
//判断是否配对过
if(device.getBondState()!
=BluetoothDevice.BOND_BONDED){
//添加到列表
bluetoothDevices.add(device.getName()+":
"
+device.getAddress()+"\n");
arrayAdapter.notifyDataSetChanged();
}
//搜索完成
}elseif(BluetoothAdapter.ACTION_DISCOVERY_FINISHED
.equals(action)){
//关闭进度条
setProgressBarIndeterminateVisibility(true);
setTitle("搜索完成!
");
}
}
};
5.客户端实现已经发送数据流
//客户端
@Override
publicvoidonItemClick(AdapterView
>parent,Viewview,intposition,
longid){
//先获得蓝牙的地址和设备名
Strings=arrayAdapter.getItem(position);
//单独解析地址
Stringaddress=s.substring(s.indexOf(":
")+1).trim();
//主动连接蓝牙
try{
//判断是否在搜索,如果在搜索,就取消搜索
if(mBluetoothAdapter.isDiscovering()){
mBluetoothAdapter.cancelDiscovery();
}
try{
//判断是否可以获得
if(device==null){
//获得远程设备
device=mBluetoothAdapter.getRemoteDevice(address);
}
//开始连接
if(clientSocket==null){
clientSocket=device
.createRfcommSocketToServiceRecord(MY_UUID);
//连接
clientSocket.connect();
//获得输出流
os=clientSocket.getOutputStream();
}
}catch(Exceptione){
//TODO:
handleexception
}
//如果成功获得输出流
if(os!
=null){
os.write("HelloBluetooth!
".getBytes("utf-8"));
}
}catch(Exceptione){
//TODO:
handleexception
}
}
6.Handler服务
//服务端,需要监听客户端的线程类
privateHandlerhandler=newHandler(){
publicvoidhandleMessage(android.os.Messagemsg){
Toast.makeText(MainActivity.this,String.valueOf(msg.obj),
Toast.LENGTH_SHORT).show();
super.handleMessage(msg);
}
};
7.服务端读取数据流
//线程服务类
privateclassAcceptThreadextendsThread{
privateBluetoothServerSocketserverSocket;
privateBluetoothSocketsocket;
//输入输出流
privateOutputStreamos;
privateInputStreamis;
publicAcceptThread(){
try{
serverSocket=mBluetoothAdapter
.listenUsingRfcommWithServiceRecord(NAME,MY_UUID);
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
@Override
publicvoidrun(){
//截获客户端的蓝牙消息
try{
socket=serverSocket.accept();//如果阻塞了,就会一直停留在这里
is=socket.getInputStream();
os=socket.getOutputStream();
//不断接收请求,如果客户端没有发送的话还是会阻塞
while(true){
//每次只发送128个字节
byte[]buffer=newbyte[128];
//读取
intcount=is.read();
//如果读取到了,我们就发送刚才的那个Toast
Messagemsg=newMessage();
msg.obj=newString(buffer,0,count,"utf-8");
handler.sendMessage(msg);
}
}catch(Exceptione){
//TODO:
handleexception
}
}
}
8.开启服务
首先要声明
//启动服务
ac=newAcceptThread();
ac.start();
MainActivity完整代码
packagecom.lgl.bluetoothget;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.util.ArrayList;
importjava.util.List;
importjava.util.Set;
importjava.util.UUID;
importandroid.app.Activity;
importandroid.bluetooth.BluetoothAdapter;
importandroid.bluetooth.BluetoothDevice;
importandroid.bluetooth.BluetoothServerSocket;
importandroid.bluetooth.BluetoothSocket;
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.content.IntentFilter;
importandroid.os.Bundle;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.util.Log;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.AdapterView;
importandroid.widget.AdapterView.OnItemClickListener;
importandroid.widget.ArrayAdapter;
importandroid.widget.Button;
importandroid.widget.ListView;
importandroid.widget.TextView;
importandroid.widget.Toast;
publicclassMainActivityextendsActivityimplementsOnItemClickListener{
//本地蓝牙适配器
privateBluetoothAdaptermBluetoothAdapter;
//列表
privateListViewlvDevices;
//存储搜索到的蓝牙
privateListbluetoothDevices=newArrayList();
//listview的adapter
privateArrayAdapterarrayAdapter;
//UUID.randomUUID()随机获取UUID
privatefinalUUIDMY_UUID=UUID
.fromString("db764ac8-4b08-7f25-aafe-59d03c27bae3");
//连接对象的名称
privatefinalStringNAME="LGL";
//这里本身即是服务端也是客户端,需要如下类
privateBluetoothSocketclientSocket;
privateBluetoothDevicedevice;
//输出流_客户端需要往服务端输出
privateOutputStreamos;
//线程类的实例
privateAcceptThreadac;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
privatevoidinitView(){
//获取本地蓝牙适配器
mBluetoothAdapter=BluetoothAdapter.getDefaultAdapter();
//判断手机是否支持蓝牙
if(mBluetoothAdapter==null){
Toast.makeText(this,"设备不支持蓝牙",Toast.LENGTH_SHORT).show();
finish();
}
//判断是否打开蓝牙
if(!
mBluetoothAdapter.isEnabled()){
//弹出对话框提示用户是后打开
Intentintent=newIntent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(intent,1);
//不做提示,强行打开
//mBluetoothAdapter.enable();
}
//初始化listview
lvDevices=(ListView)findViewById(R.id.lvDevices);
lvDevices.setOnItemClickListener(this);
//获取已经配对的设备
SetpairedDevices=mBluetoothAdapter
.getBondedDevices();
//判断是否有配对过的设备
if(pairedDevices.size()>0){
for(BluetoothDevicedevice:
pairedDevices){
//遍历到列表中
bluetoothDevices.add(device.getName()+":
"
+device.getAddress()+"\n");
}
}
//adapter
arrayAdapter=newArrayAdapter(this,
android.R.layout.simple_list_item_1,android.R.id.text1,
bluetoothDices);
lvDevices.setAdapter(arrayAdapter);
//启动服务
ac=newAcceptThread();
ac.start();
/**
*异步搜索蓝牙设备——广播接收
*/
//找到设备的广播
IntentFilterfilter=newIntentFilter(BluetoothDevice.ACTION_FOUND);
//注册广播
registerReceiver(receiver,filter);
//搜索完成的广播
filter=newIntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
//注册广播
registerReceiver(receiver,filter);
}
publicvoidbtnSearch(Viewv){
//设置进度条
setProgressBarIndeterminateVisibility(true);
setTitle("正在搜索...");
//判断是否在搜索,如果在搜索,就取消搜索
if(mBluetoothAdapter.isDiscovering()){
mBluetoothAdapter.cancelDiscovery();
}
//开始搜索
mBluetoothAdapter.startDiscovery();
}
//广播接收器
privatefinalBroadcastReceiverreceiver=newBroadcastReceiver(){
@Override
publicvoidonReceive(Contextcontext,Intentintent){
//收到的广播类型
Stringaction=intent.getAction();
//发现设备的广播
if