清单文件需要加权限
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH"/>
BluetoothManager 蓝牙管理类,管理BluetoothAdapter。主要负责管理蓝牙的本地连接。
BluetoothAdapter 蓝牙适配器类:代表本蓝牙设备
BluetoothDevice 蓝牙设备,配对后的远程蓝牙设备
BluetoothServiceSocket 蓝牙服务器
BluetoothSocket 蓝牙客户端
蓝牙传输功能的UUID:00001101-0000-1000-8000-00805F9B34FB
蓝牙常用Action
BluetoothDevice.ACTION_FOUND 可发现蓝牙设备
BluetoothAdapter.ACTION_DISCOVERY_FINISHED 蓝牙设备的搜索结果
BluetoothDevice.ACTION_BOND_STATE_CHANGED 蓝牙设备的绑定状态
BluetoothAdapter.ACTION_REQUEST_ENABLE //启动蓝牙
BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE//开启设备可被发现
BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION//指定搜索时间
BluetoothDevice.EXTRA_DEVICE获得蓝牙设
package com.example.day10bluetool;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
import com.example.day10bluetool.Lianjie.ConnecctionManager;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private ListView listView;
private MainAdpter mainAdpter;
private List<BlueToothBean> list = new ArrayList<>();
private BluetoothManager bluetoothManager;
private BluetoothAdapter bluetoothAdapter;
private BluetoothReceiver bluetoothReceiver;
BluetoothDevice bluetoothDevice;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initview();
initDate();
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
try {
Method method=BluetoothDevice.class.getMethod("createBond");
method.invoke(list.get(position).bluetoothDevice);
} catch (Exception e) {
}
}
});
}
private void initview() {
listView=findViewById(R.id.lv);
findViewById(R.id.btn_start).setOnClickListener(this);
findViewById(R.id.btn_top).setOnClickListener(this);
findViewById(R.id.btn_search).setOnClickListener(this);
mainAdpter = new MainAdpter();
listView.setAdapter(mainAdpter);
}
private void initDate() {
bluetoothManager = (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);
bluetoothAdapter = bluetoothManager.getAdapter();
if (bluetoothAdapter == null) {
finish();
return;
}
bluetoothReceiver = new BluetoothReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(BluetoothDevice.ACTION_FOUND);//可发现
intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);//搜索结果
intentFilter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);//绑定状态
registerReceiver(bluetoothReceiver, intentFilter);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_start:
boolean flag=bluetoothAdapter.enable();
if(!flag){
Intent intent=new Intent();
intent.setAction(BluetoothAdapter.ACTION_REQUEST_ENABLE);//启动蓝牙
intent.setAction(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);//开启设备可被发现
intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,200);//指定搜索时间
startActivityForResult(intent,100);
}
break;
case R.id.btn_top:
list.clear();
mainAdpter.refresh(list);
bluetoothAdapter.disable();//关闭蓝牙
break;
case R.id.btn_search:
bluetoothAdapter.startDiscovery();//开启搜素
break;
default:
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==100&&requestCode==RESULT_OK){
Toast.makeText(this, "蓝牙已开启", Toast.LENGTH_SHORT).show();
}
}
private class BluetoothReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
switch (action) {
case BluetoothDevice.ACTION_FOUND:
//搜索到一台蓝牙设备,进入一次Found
//搜索到的设备保存到list中
bluetoothDevice =
intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
BlueToothBean blueToothBean = new BlueToothBean();
blueToothBean.name = bluetoothDevice.getName();
blueToothBean.address = bluetoothDevice.getAddress();
blueToothBean.bluetoothDevice = bluetoothDevice;
list.add(blueToothBean);
//TODO adapter刷新的方法
mainAdpter.refresh(list);
break;
case BluetoothAdapter.ACTION_DISCOVERY_FINISHED:
//TODO adapter刷新的方法
mainAdpter.refresh(list);
break;
case BluetoothDevice.ACTION_BOND_STATE_CHANGED:
int state=bluetoothDevice.getBondState();
if(state==BluetoothDevice.BOND_NONE){
Log.d("####", "没有设备");
}else if(state==BluetoothDevice.BOND_BONDING){
Log.d("####", "正在匹配中,有可能正在弹框");
}else if(state==BluetoothDevice.BOND_BONDED){
Log.d("####", "匹配成功");
ConnecctionManager connecctionManager=new ConnecctionManager(bluetoothDevice);
}
break;
default:
break;
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(bluetoothReceiver);
}
}
package com.example.day10bluetool;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.util.Log;
import java.io.IOException;
import java.io.OutputStream;
import java.util.UUID;
/**
* 发数据
* 1.设备
* 2.内容
* 3.需要用来 BluewToothSocket
*/
public class ConnecctionManager {
private String uuid="00001101-0000-1000-8000-00805F9B34FB";
private BluetoothDevice device;
//传输的 用来传输的
private BluetoothSocket socket;
public ConnecctionManager(BluetoothDevice device) {
this.device = device;
new SenThread().start();
}
class SenThread extends Thread{
@Override
public void run() {
super.run();
try {
socket=device.createRfcommSocketToServiceRecord(UUID.fromString(uuid));
socket.connect();//链接
Log.d("Main2Activoty","连接成功 ");
OutputStream outputStream = socket.getOutputStream();
outputStream.write("蓝牙已经链接".getBytes());
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package com.example.day10bluetool;
import android.bluetooth.BluetoothDevice;
public class BlueToothBean {
public String name;
public String address;
public BluetoothDevice bluetoothDevice;
}
package com.example.day10bluetool;
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 java.util.ArrayList;
import java.util.List;
class MainAdpter extends BaseAdapter {
private List<BlueToothBean> list = new ArrayList<>();
public void refresh(List<BlueToothBean> list) {
this.list.addAll(list);
notifyDataSetChanged();
}
@Override
public int getCount() {
if (list.size() != 0) {
return list.size();
}
return 0;
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
convertView = layoutInflater.inflate(R.layout.list_item, parent, false);
viewHolder.address = convertView.findViewById(R.id.address);
viewHolder.name = convertView.findViewById(R.id.name);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
viewHolder.address.setText(list.get(position).address);
viewHolder.name.setText(list.get(position).name);
}
return convertView;
}
static class ViewHolder {
private TextView name;
private TextView address;
}
}
package com.example.day10bluetool;
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 java.util.ArrayList;
import java.util.List;
class MainAdpter extends BaseAdapter {
private List<BlueToothBean> list = new ArrayList<>();
public void refresh(List<BlueToothBean> list) {
this.list.addAll(list);
notifyDataSetChanged();
}
@Override
public int getCount() {
if (list.size() != 0) {
return list.size();
}
return 0;
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
convertView = layoutInflater.inflate(R.layout.list_item, parent, false);
viewHolder.address = convertView.findViewById(R.id.address);
viewHolder.name = convertView.findViewById(R.id.name);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
viewHolder.address.setText(list.get(position).address);
viewHolder.name.setText(list.get(position).name);
}
return convertView;
}
static class ViewHolder {
private TextView name;
private TextView address;
}
}