Android蓝牙(一)

原创 2016年08月29日 21:34:23

一、蓝牙简介

1.权限

<!-- 控制蓝牙的权限 -->
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<!-- 获取蓝牙信息权限,使用蓝牙必须的权限 -->
<uses-permission android:name="android.permission.BLUETOOTH" />

二、常用类

1.BluetoothAdapter

对象获取方法

private BluetoothAdapter myBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

常见属性

属性 介绍
STATE_OFF 值为10, 蓝牙模块处于关闭状态
STATE_TURNING_ON 值为11, 蓝牙模块正在打开ing
STATE_ON 值为12, 蓝牙模块处于开启状态
STATE_TURNING_OFF 值为13, 蓝牙模块正在关闭ing
SCAN_MODE_NONE 值为20, 查询扫描和页面扫描都失效, 该状态下蓝牙模块既不能扫描其它设备, 也不可见
SCAN_MODE_CONNECTABLE 值为21, 查询扫描失效, 页面扫描有效, 该状态下蓝牙模块可以扫描其它设备, 从可见性来说只对已配对的蓝牙设备可见, 只有配对的设备才能主动连接本设备
SCAN_MODE_CONNECTABLE_DISCOVERABLE 值为23, 查询扫描和页面扫描都有效
ACTION_DISCOVERY_FINISHED 蓝牙适配器完成搜索发出的广播, 值为”android.bluetooth.adapter.action.DISCOVERY_FINISHED”, 需要BLUETOOTH权限
ACTION_LOCAL_NAME_CHANGED 本地的蓝牙适配器改变了自己的名称,值为”android.bluetooth.adapter.action.SCAN_MODE_CHANGED”, 该Intent对象包含了EXTRA_SCAN_MODE和EXTRA_PREVIOUS_SCAN_MODE, 两个附加域分别是新的和旧的扫描模式, 这里可以根据前后扫描模式的不同做出不同的操作, 需要BLUETOOTH权限
ACTION_STATE_CHANGED 蓝牙模块被打开或者关闭, 值为”android.bluetooth.adapter.action.STATE_CHANGED”, 该广播的Intent中包含EXTRA_STATE和EXTRA_PREVIOUS_STATE两个附加域, 需要BLUETOOTH权限

常用方法

方法 介绍
cancelDiscovery() 取消搜索
disable() 关闭蓝牙(不通知用户)
enable() 打开蓝牙(不通知用户)
getAddress() 获取地址
getDefaultAdapter() 获取BluetoothAdapter
getName() 获取蓝牙名字
getRemoteDevice(String address) 根据蓝牙地址获取远程蓝牙设备
getState() 获取本地蓝牙适配器当前状态(感觉可能调试的时候更需要)
isDiscovering() 判断当前是否正在查找设备,是返回true
isEnabled() 判断蓝牙是否打开,已打开返回true
startDiscovery() 开始搜索,其实是开启一个广播,返回信息在广播中

2.BluetoothDevice

很多和BluetoothAdapter差不多

方法 介绍
getState() 蓝牙状态,只有在 BluetoothAdapter.STATE_ON 状态下才可以监听
getAddress() 获取地址
getName() 获取名字

3.BluetoothServerSocket

4.BluetoothSocket

三、打开、关闭、搜索蓝牙

1.先上效果图

效果图

2.代码

/**
 * 我这里用了xUtils3框架和我自己写的ToastUtil,在我的优化Toast中有说
 */
@ContentView(R.layout.activity_bluetooth)
public class BluetoothActivity extends BaseActivity {

    /**
     * ACTION_FOUND 搜索状态
     * BOND_BONDED 绑定状态
     * ACTION_DISCOVERY_FINISHED 搜索完成
     */

    private Context context;
    private BluetoothAdapter myBluetoothAdapter;
    /**
     * 自定义广播类
     */
    private BaseBroadcastReceiver myBluetoothReceiver = new BaseBroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (action.equals(BluetoothDevice.ACTION_FOUND)) {
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                // 不搜索已经绑定的蓝牙设备
                if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
                    LogUtil.i("搜索到的设备:" + device.getName() + ":" + device.getAddress());
                }
            } else if (action.equals(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)) {
                ToastUtil.showToast(context, "搜索完成");
            }
        }
    };

    @ViewInject(R.id.show)
    private TextView show;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        x.view().inject(this);
        context = BluetoothActivity.this;
        myBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        getBoundedBluetooth();

        // 注册用以接收到已搜索到的蓝牙设备的receiver
        IntentFilter filter = new IntentFilter();
        filter.addAction(BluetoothDevice.ACTION_FOUND);//
        filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
        registerReceiver(myBluetoothReceiver, filter);
    }
    /**
     * 获取已经绑定的蓝牙设备
     */
    public void getBoundedBluetooth() {
        Set<BluetoothDevice> devices = myBluetoothAdapter.getBondedDevices();
        if (devices.size() > 0) {
            for (BluetoothDevice bluetoothDevice : devices) {
                show.append("已经绑定了的:" + bluetoothDevice.getName() + ":" + bluetoothDevice.getAddress() + "\n\n");
            }
        }
    }

    /**
     * 打开蓝牙
     * @param view
     */
    @Event(R.id.open)
    private void openBluetooth(View view) {

        if (myBluetoothAdapter == null) {
            ToastUtil.showToast(context, "本机没有找到蓝牙硬件或驱动!");
        }
        if (!myBluetoothAdapter.isEnabled()) {
            Intent mIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(mIntent, 1);
        }
    }

    /**
     * 用户打开蓝牙时,选择的返回处理
     * @param requestCode
     * @param resultCode
     * @param data
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1) {
            if (resultCode == RESULT_OK) {
                ToastUtil.showToast(context, "蓝牙已经开启");
            } else if (resultCode == RESULT_CANCELED) {
                ToastUtil.showToast(context, "不允许蓝牙开启");
            }
        }
    }

    /**
     * 关闭蓝牙
     * @param view
     */
    @Event(R.id.close)
    private void closeBluetooth(View view) {
        if (myBluetoothAdapter.isEnabled()) {
            myBluetoothAdapter.disable();
            ToastUtil.showToast(context, "蓝牙已经关闭");
        }
    }

    /**
     * 扫描附近的蓝牙设备
     * @param view
     */
    @Event(R.id.find)
    private void findBluetooth(View view) {
        ToastUtil.showToast(context, "启动扫描!");
        // 如果正在搜索,就先取消搜索
        if (myBluetoothAdapter.isDiscovering()) {
            myBluetoothAdapter.cancelDiscovery();
        }
        // 开始搜索蓝牙设备,搜索到的蓝牙设备通过广播返回,这是一个广播发送者
        myBluetoothAdapter.startDiscovery();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //解除注册
        unregisterReceiver(myBluetoothReceiver);
    }

}
版权声明:转载请标示出处,链接http://blog.csdn.net/tea_gag

Android蓝牙开发教程(一)——搜索蓝牙设备

Android蓝牙功能的开发一直是很多新手头疼的问题,网上虽然也有很多教程贴,但大多都写得不是很好,不能让我们真正掌握蓝牙开发的基本知识。本教程主要讲解搜索蓝牙设备、蓝牙设备之间的连接和蓝牙之间的通讯...
  • a1533588867
  • a1533588867
  • 2016年09月05日 17:59
  • 4117

Android手机靠近蓝牙模块自动连接蓝牙模块,断后自动重连。也可以手机靠近手机自动连接。连接成功率百分之百,可后台运行

全球首创的新技术。小黄人独家推出基于bluetoothchat的,手机靠近蓝牙模块自动连接蓝牙模块,断后自动重连,多设备自由切换,记忆连接,可后台运行。连接成功率百分之百。可以应用在工业通讯,手机游戏...
  • chenhao0568
  • chenhao0568
  • 2015年12月05日 20:54
  • 1142

Android 蓝牙开发(八)hfp接听、挂断电话

继续研究hfp相关功能。蓝牙耳机可以控制手机接听、拒接、挂断电话,拨打电话等功能。本文主要分析下起这些操作的大致流程。...
  • VNanyesheshou
  • VNanyesheshou
  • 2017年05月10日 16:32
  • 13984

安卓蓝牙开发的几个版本区别

4.3以后就可以ble了,低功耗,更碉堡 5.0 L支持手机被搜索功能,大致是周围设备的支持,也就是你手机可以被检索到,不过nexus5不知道为什么不 可以用。that is...
  • u010527630
  • u010527630
  • 2016年03月13日 13:40
  • 740

Android 低功耗蓝牙的多设备连接与数据接收,简单实现

不知不觉,通宵加班已经快两个星期了,快两年没这么干活了。 起因就是项目的一个功能,蓝牙多连接。应用同时连接多个设备,等待接收数据,处理后显示图表。 在这之前我没有搞过蓝牙方面的东西,只能从基础开始边看...
  • geanwen
  • geanwen
  • 2017年06月23日 15:52
  • 2914

蓝牙一主三从, 基于cc2540 cc2541 AMOMCU 蓝牙4.0开发板

应不少网友的要求,需要1个主机连接多个从机的例程,amomcu经过开发调试,实现了最大1主3从的功能,主机可通过TI自定义特征值服务CHAR1读写任意已连接上的从机,任意从机可以通过我们自定义的CHA...
  • mzy202
  • mzy202
  • 2014年12月13日 18:16
  • 7736

手把手教你做蓝牙小车(二)

遥控车是不是都玩过? 有没想过自己攒一个?
  • anddlecn
  • anddlecn
  • 2016年06月07日 14:25
  • 6432

Android6.0蓝牙协议之OPP

因为毕设做了蓝牙通信相关的,所以工作后让我负责蓝牙模块。但是有bug的时候才发现对蓝牙协议的了解少之又少,现在先分析一个文件传输协议 Chapter One,简单介绍 1,OPP:Object p...
  • zrf1335348191
  • zrf1335348191
  • 2016年11月16日 17:02
  • 2660

BLE开发(TI CC254x)之一主多从方案(蓝牙项目纪实)

近期一个BLE项目,整套方案做下来发现虽然需求特殊,但是根据这个项目可以衍生出BLE设备一主多从的一般性方法。 项目的需求基本如下: 1.实现基于CC2541芯片的蓝牙主机固件代码,要求主机1拖4从机...
  • hechao3225
  • hechao3225
  • 2016年12月29日 22:23
  • 1888

Android蓝牙开发之一:打开、关闭蓝牙

转载地址:http://victorzhong.github.io/2015/07/26/Android%E8%93%9D%E7%89%99%E5%BC%80%E5%8F%91%E4%B9%8B%E4...
  • luisliuyi
  • luisliuyi
  • 2016年04月19日 20:47
  • 9840
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android蓝牙(一)
举报原因:
原因补充:

(最多只允许输入30个字)