开启、关闭、搜索蓝牙
一、步骤
1、加权限
2、常用方法
1、打开蓝牙:
(1)、Intent intent = new intent();
intent.setAction(BluetoothAdapter.Action_REQUEST_ENABLE) --启动蓝牙请求
intent.setAction(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); --暴露蓝牙可发现
intent.setAction(BluetoothAdapter.EXTRA.DISCPVERABLE_DERATOON,200); --设置多久可以搜到蓝牙
startActivityForResult(intent,100); – 请求码
2、关闭蓝牙
适配器.disable();
3、配对蓝牙
设备.createBond();
4、搜索
适配器.startDiscoery();
3、常用类
BluetoothManager:蓝牙管理类,管理bluetoothAdapter,管理蓝牙连接
BluetoothAdapter:蓝牙适配器,代表本蓝牙
BluetothDevice:蓝牙设备,是连接的那个设备(对方的)
BluetoothServiceSocket:服务器
BluetoothSocket:客户端
蓝牙的传输功能的UUID是:00001101-0000-1000-8000-00805F9B34FB
uuid.fromString(UUID); --类型转换
4、Action
ACTION_BOND_STATE_CHANGED --createBond配对方法(反射) 连接状态
ACTION_FOUND -startDiscovery(); --搜索蓝牙,发现蓝牙
ACTION_DISCOVPERY_FINISAED --搜索蓝牙结束 -startDiscovery()
二、开启,关闭、搜索、匹配,代码展示
布局展示
Bean类
适配器
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
ArrayList list;
Context context;
OnItemClick onItemClick;
public MyAdapter(ArrayList<MyBean> list, Context context, OnItemClick onItemClick) {
this.list = list;
this.context = context;
this.onItemClick = onItemClick;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(context).inflate(R.layout.bluetooth_item,viewGroup,false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, final int i) {
myViewHolder.t1.setText(list.get(i).getName());
myViewHolder.t2.setText(list.get(i).getAddress());
myViewHolder.t1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onItemClick.OnItemClick(i);
}
});
myViewHolder.t2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onItemClick.OnItemClick(i);
}
});
}
@Override
public int getItemCount() {
return list.size();
}
class MyViewHolder extends RecyclerView.ViewHolder{
TextView t1,t2;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
t1 = itemView.findViewById(R.id.text_name);
t2 = itemView.findViewById(R.id.text_address);
}
}
interface OnItemClick{
public void OnItemClick(int postion);
}
}
主类代码
public class Main2Activity extends AppCompatActivity implements View.OnClickListener {
Button b1,b2,b3;
RecyclerView recyclerView;
// ArrayList devices = new ArrayList<>();
ArrayList list = new ArrayList<>();
MyAdapter adapter;
MyBean bean;
BluetoothManager bluetoothManager;
BluetoothAdapter bluetoothAdapter;
BluetoothReceiver bluetoothReceiver;
boolean flag = true;
boolean permission = true;
private String[] permiss;
private static final String TAG = "Main2Activity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
initView();
start();
}
@SuppressLint("ObsoleteSdkInt")
public void initView(){
b1 = findViewById(R.id.button_start);
b2 = findViewById(R.id.button_search);
b3 = findViewById(R.id.button_stop);
b1.setOnClickListener(this);
b2.setOnClickListener(this);
b3.setOnClickListener(this);
recyclerView = findViewById(R.id.recyclerView);
final LinearLayoutManager manager = new LinearLayoutManager(this);
manager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(manager);
permiss = new String[]{Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.BLUETOOTH,Manifest.permission.BLUETOOTH_ADMIN};
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
for (int i = 0; i < permiss.length; i++) {
if (checkSelfPermission(permiss[i]) != PackageManager.PERMISSION_GRANTED){
flag = false;
}
}
if (!flag){
requestPermissions(permiss,100);
}
}
adapter = new MyAdapter(list, this, new MyAdapter.OnItemClick() {
@Override
public void OnItemClick(int postion) {
MyBean myBean = list.get(postion);
BluetoothDevice device = myBean.getBluetoothDevice();
try {
Method method = BluetoothDevice.class.getMethod("createBond");
method.invoke(device);
Log.e(TAG,device+"");
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
});
recyclerView.setAdapter(adapter);
}
public void start(){
bluetoothManager = (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);
bluetoothAdapter = bluetoothManager.getAdapter();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ACTION_FOUND);
intentFilter.addAction(ACTION_DISCOVERY_FINISHED);
intentFilter.addAction(ACTION_BOND_STATE_CHANGED);
bluetoothReceiver = new BluetoothReceiver();
registerReceiver(bluetoothReceiver,intentFilter);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 100){
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED){
permission = false;
}
}
if (!permission){
Toast.makeText(this, "没有该项权限", Toast.LENGTH_SHORT).show();
}
}
}
@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();
Log.e(TAG,bluetoothAdapter.getName()+bluetoothAdapter.getAddress());
}else{
Toast.makeText(this, "连接失败", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.button_start:
boolean result = bluetoothAdapter.enable();//强制打开蓝牙
bluetoothAdapter.startDiscovery(); //搜索蓝牙
if (result == false){
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.button_search:
bluetoothAdapter.startDiscovery();
break;
case R.id.button_stop:
bluetoothAdapter.disable();
list.clear();
break;
}
}
class BluetoothReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String type = intent.getAction();
switch (type){
case ACTION_BOND_STATE_CHANGED:
break;
case ACTION_FOUND:
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
bean = new MyBean(device.getName(),device.getAddress(),device);
list.add(bean);
break;
case ACTION_DISCOVERY_FINISHED:
adapter.notifyDataSetChanged();
break;
}
}
}
}