前言

半年没有更新博客了,首要原因就是我太懒了,其次是换了新工作,新环境,一直都处于适应与学习阶段,因为涉及到的领域以前都是没接触的–有幸外派到海尔做智能家居,第一次到这种大的公司来敲代码,很多东西都和之前不太一样了,以前一个需求只要做出来就行,不管你用什么方式,现在都是必须用什么实现,比如:代码架构必须是clean architecture干净架构,干净架构的presentation层必须用MVVP或者MVP,网络框架必须是RxJava+Retrofit……不会就得埋头学,代码也是有一套规范,审核几次才能入库等等,每个功能模块都封装成一个远程依赖库,需要什么功能就加什么依赖,记得刚来的时候,领导让我把主工程库clone下来熟悉代码,我打开项目完全是懵逼的状态,里面啥都没有,但是跑起来是一个功能强大的app,我的天啊,MainActivity都找不到,怎么撸代码,直到我打开了gradle,十几个远程依赖….扯远了,前几天接了一个蓝牙设备,总结一下相关知识,以备我后时之需,因为东西还不少,所以分开写

正文

0,添加权限

<uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

1,获取手机当前蓝牙的状态

/**
     * 初始化蓝牙的状态
     */
    private void initBtState() {
        //获取蓝牙适配器
        btAdapter = BluetoothAdapter.getDefaultAdapter();
        //蓝牙当前的状态,true代表蓝牙是开启的,false代表是关闭状态
        boolean enabled = btAdapter.isEnabled();
        String strState = "";
        if (enabled) {
            strState = "开启";
        } else {
            strState = "关闭";
        }
        setBtState(strState);
    }

2,监听蓝牙手动开关

1),注册监听广播

/**
     * 注册监听蓝牙状态广播
     */
    private void registerBtReceiver() {
        IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
        registerReceiver(btStateReceiver, filter);
    }

2)传入广播接收器来接收蓝牙被打开被关闭

/**
     * 蓝牙action接收,当用户手动开关蓝牙的时候回回调到这里
     */
    BroadcastReceiver btStateReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            //手动开关蓝牙会触发这个接收器,然后拿到蓝牙当前的状态
            int blueState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0);
            String strState = "";
            switch (blueState) {
                case BluetoothAdapter.STATE_ON://蓝牙被打开
                    strState = "开启";
                    break;
                case BluetoothAdapter.STATE_OFF://蓝牙被关闭:
                    strState = "关闭";
                    break;
                case BluetoothAdapter.STATE_TURNING_ON://蓝牙正在打开:
                    strState = "正在开启";
                    break;
                case BluetoothAdapter.STATE_TURNING_OFF://蓝牙正在关闭:
                    strState = "正在关闭";
                    break;
            }
            setBtState(strState);
        }
    };

3,用代码关闭和开启蓝牙

1),开启 有2中方式

/**
     * 打开蓝牙
     *
     * @param isSilent 打开蓝牙的方式
     *                 false--通知方式打开 true 不提示直接开(不太友好)
     */
    private void openBt(boolean isSilent) {
        if (isSilent) {
            btAdapter.enable();
        } else {
            Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivity(intent);
        }
    }

android中语音怎么监听蓝牙电话在前台_初始化

2)关闭蓝牙

/**
     * 关闭蓝牙
     */
    private void closeBt() {
        btAdapter.disable();
    }

完整的activity代码:

package com.duanlian.btdemo;

import android.bluetooth.BluetoothAdapter;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity
            implements View.OnClickListener {
    private TextView tvBtState;
    private Button btnOpenBt;
    private Button btnCloseBt;
    private BluetoothAdapter btAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();

    }

    @Override
    protected void onResume() {
        super.onResume();
        registerBtReceiver();//注册蓝牙状态监听
        initBtState();//初始化蓝牙状态
    }

    @Override
    protected void onPause() {
        super.onPause();
        unregisterBtReceiver();
    }

    /**
     * 初始化蓝牙的状态
     */
    private void initBtState() {
        //获取蓝牙适配器
        btAdapter = BluetoothAdapter.getDefaultAdapter();
        //蓝牙当前的状态,true代表蓝牙是开启的,false代表是关闭状态
        boolean enabled = btAdapter.isEnabled();
        String strState = "";
        if (enabled) {
            strState = "开启";
        } else {
            strState = "关闭";
        }
        setBtState(strState);
    }

    /**
     * 注册监听蓝牙状态广播
     */
    private void registerBtReceiver() {
        IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
        registerReceiver(btStateReceiver, filter);
    }

    /**
     * 注销蓝牙监听广播
     */
    private void unregisterBtReceiver() {
        unregisterReceiver(btStateReceiver);
    }

    /**
     * 蓝牙action接收,当用户手动开关蓝牙的时候回回调到这里
     */
    BroadcastReceiver btStateReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            //手动开关蓝牙会触发这个接收器,然后拿到蓝牙当前的状态
            int blueState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0);
            String strState = "";
            switch (blueState) {
                case BluetoothAdapter.STATE_ON://蓝牙被打开
                    strState = "开启";
                    break;
                case BluetoothAdapter.STATE_OFF://蓝牙被关闭:
                    strState = "关闭";
                    break;
                case BluetoothAdapter.STATE_TURNING_ON://蓝牙正在打开:
                    strState = "正在开启";
                    break;
                case BluetoothAdapter.STATE_TURNING_OFF://蓝牙正在关闭:
                    strState = "正在关闭";
                    break;
            }
            setBtState(strState);
        }
    };

    private void initView() {
        tvBtState = (TextView) findViewById(R.id.tvBtState);
        btnOpenBt = (Button) findViewById(R.id.btnOpenBt);
        btnCloseBt = (Button) findViewById(R.id.btnCloseBt);
        btnOpenBt.setOnClickListener(this);
        btnCloseBt.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        int id = v.getId();
        switch (id) {
            case R.id.btnOpenBt://打开蓝牙
                openBt(false);
                break;
            case R.id.btnCloseBt://关闭蓝牙
                closeBt();
                break;
        }
    }

    /**
     * 打开蓝牙
     *
     * @param isSilent 打开蓝牙的方式
     *                 false--通知方式打开 true 不提示直接开(不太友好)
     */
    private void openBt(boolean isSilent) {
        if (isSilent) {
            btAdapter.enable();
        } else {
            Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivity(intent);
        }
    }

    /**
     * 关闭蓝牙
     */
    private void closeBt() {
        btAdapter.disable();
    }

    private void setBtState(String state) {
        tvBtState.setText(state);
    }
}

demo下载地址:点击下载