蓝牙是一个短距离连接传输数据的工具
添加权限
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH"/>
增加运行时权限(添加位置)
requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION},100);
开启蓝牙(使用隐式跳转)
Intent intent = new Intent();
intent.setAction(BluetoothAdapter.ACTION_REQUEST_ENABLE);
intent.setAction(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,200);
startActivity(intent);
关闭蓝牙
private BluetoothAdapter bluetoothAdapter;
private BluetoothManager bluetoothManager;
bluetoothManager= (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);
bluetoothAdapter=bluetoothManager.getAdapter();
bluetoothAdapter.disable();
查找匹配过的蓝牙设备
private List<BluetoothDevice> onelist=new ArrayList();
private MyBlueAdapter myBlueAdapter;
myBlueAdapter=new MyBlueAdapter(onelist,MainActivity.this);
main_twolist.setAdapter(myBlueAdapter);
onelist.clear();
Set<BluetoothDevice> bondedDevices = bluetoothAdapter.getBondedDevices();
for (BluetoothDevice bondedDevice : bondedDevices) {
Log.i("----", "onClick: "+bondedDevice.toString());
onelist.add(bondedDevice);
}
Log.i("----", "onClick: "+bondedDevices.size());
myBlueAdapter.notifyDataSetChanged();
查找附近的设备(是通过注册一个广播接收消息存入集合放入listview里)
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(BluetoothDevice.ACTION_FOUND);
MyfujinBule myfujinBule = new MyfujinBule();
registerReceiver(myfujinBule,intentFilter);
bluetoothAdapter.startDiscovery();
class MyfujinBule extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(BluetoothDevice.ACTION_FOUND)){
BluetoothDevice bluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
twolist.add(bluetoothDevice);
fujinmyBlueAdapter.notifyDataSetChanged();
}
}
}
请求连接蓝牙设备
bluetoothDevice.createBond();
通过蓝牙发送信息(客户端:是根据socket进行的传递)
public class SendThread extends Thread{
private BluetoothSocket socket;
private String mess;
public SendThread(BluetoothSocket socket, String mess) {
this.socket = socket;
this.mess = mess;
}
@Override
public void run() {
super.run();
try {
socket.connect();
socket.getOutputStream().write(mess.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}
通过蓝牙接收信息(服务器:是通过serverSocket接收,在开启蓝牙是的逻辑中写入)
new Thread(new Runnable() {
@Override
public void run() {
while(true){
BluetoothServerSocket bluetoothServerSocket = null;
try {
bluetoothServerSocket = bluetoothAdapter.listenUsingInsecureRfcommWithServiceRecord(bluetoothAdapter.getName(), uuid);
new SerSocket(bluetoothServerSocket.accept(),handler).start();
Log.i("----", "run: aaaaaaaaaaaaaaaaaaaa");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}).start();
public class SerSocket extends Thread{
private BluetoothSocket serverSocket;
private Handler handler;
public SerSocket(BluetoothSocket serverSocket, Handler handler) {
this.serverSocket = serverSocket;
this.handler = handler;
}
@Override
public void run() {
super.run();
try {
InputStream inputStream = serverSocket.getInputStream();
int len=0;
byte[] b=new byte[1024];
String s = null;
while((len=inputStream.read(b))!=-1){
s = new String(b, 0, len);
Message message = new Message();
message.what=200;
message.obj=s;
Log.i("---------", "run:收到的消息 "+s);
handler.sendMessage(message);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}