Android Developer -- Bluetooth篇 开发实例之一

第一步:声明Bluetooth Permissions

    <!-- 设置蓝牙访问权限 -->
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

第二步:获取BluetoothAdapter,判断该设备是否支持蓝牙

        BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        if (mBluetoothAdapter == null) {
            // Device does not support Bluetooth
            // 说明该设备不支持蓝牙
        }

第三步:检查当前的蓝牙是否开启

if (!mBluetoothAdapter.isEnabled()) {
            Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
            // 不做提示,强行打开
            // mAdapter.enable();
        }

如果是第一种方式:会出现提示弹窗

A dialog will appear requesting user permission to enable Bluetooth, as shown in Figure 1. If the user responds "Yes," the system will begin to enable Bluetooth and focus will return to your application once the process completes (or fails).

If enabling Bluetooth succeeds, your Activity will receive the RESULT_OK result code in the onActivityResult() callback. If Bluetooth was not enabled due to an error (or the user responded "No") then the result code will be RESULT_CANCELED.

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_ENABLE_BT) {
            if (resultCode == RESULT_OK) {
                // 蓝牙已经开启
                Log.d("h_bl", "蓝牙已经开启完毕");
                String bluetoothName = bluetoothAdapter.getName(); // 获取本地蓝牙名称
                String bluetoothAddress = bluetoothAdapter.getAddress(); // 获取本地蓝牙地址
                tv_bluetoothName.append(bluetoothName);
                tv_bluetoothAddress.append(bluetoothAddress);
            } else {
                Log.d("h_bl", "蓝牙开启失败");
            }
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

其中,

private int REQUEST_ENABLE_BT = 1; // 蓝牙打开的请求码

Optionally, your application can also listen for the ACTION_STATE_CHANGED broadcast Intent, which the system will broadcast whenever the Bluetooth state has changed. This broadcast contains the extra fields EXTRA_STATE and EXTRA_PREVIOUS_STATE, containing the new and old Bluetooth states, respectively. Possible values for these extra fields areSTATE_TURNING_ONSTATE_ONSTATE_TURNING_OFF, and STATE_OFF. Listening for this broadcast can be useful to detect changes made to the Bluetooth state while your app is running.

可选的,你的应用可以监听ACTION_STATE_CHANGED广播intent,当系统蓝牙状态改变将会发起这个广播,这个广播包含了EXTRA_STATE和EXTRA_PREVIOUS_STATE额外的字段,包含了新的和旧的蓝牙状态分别的,可能 有STATE_TURNING_ON,STATE_ON,STATE_TURNING_OFF和STATE_OFF可能的值,监听广播能够 对于检测蓝牙状态改变是有用的。  --- 用来判断蓝牙是否开启完毕

Tip: Enabling discoverability will automatically enable Bluetooth. If you plan to consistently enable device discoverability before performing Bluetooth activity, you can skip step 2 above. Read about enabling discoverability, below.

提示:启用程序会自动启用蓝牙。如果你打算开启设备的可见性,可以跳过上面的2步。阅读关于启用可发现,下面。   --- 设置蓝牙的可见性

第四步:寻找其他设备

使用BluetoothAdapter,你能够打开可见性的设备(搜索到的蓝牙设备)和已经配对的的设备列表。

记住配对和连接之间的区别,已经配对的意味着两个设备是互相认识对方的存在,已经有了一个用来认证的共享的key,然后可以被捕捉对于建立一个可信的连接互相。

4.1 找到已经配对的设备

        Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
        // If there are paired devices
        if (pairedDevices.size() > 0) {
            // Loop through paired devices
            for (BluetoothDevice device : pairedDevices) {
                // Add the name and address to an array adapter to show in a ListView
                mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
            }
        } else {
            Toast.makeText(getApplicationContext(), "没有找到已匹对的设备!", Toast.LENGTH_SHORT).show();
        }

4.2 发现设备

调用startDiscovery()函数后,系统将扫描12秒,返回找到的蓝牙设备。我们需用广播来接收。

For each device, the system will broadcast the ACTION_FOUND Intent. This Intent carries the extra fields EXTRA_DEVICE and EXTRA_CLASS, containing a BluetoothDevice and a BluetoothClass, respectively. For example, here‘s how you can register to handle the broadcast when devices are discovered:

每发现一个设备,系统就会发送ACTION_FOUND Intent.的广播,这个Intent携带额外的字段EXTRA_DEVICE and EXTRA_CLASS,包含a BluetoothDevice and a BluetoothClass。

// Create a BroadcastReceiver for ACTION_FOUND
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        // When discovery finds a device
        if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            // Get the BluetoothDevice object from the Intent
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            // Add the name and address to an array adapter to show in a ListView
            mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
        }
    }
};
// Register the BroadcastReceiver
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mReceiver, filter); // Don‘t forget to unregister during onDestroy

其中,需要调用

// 扫描蓝牙设备
btAdapter.startDiscovery();

注意:Once you have found a device to connect, be certain that you always stop discovery with cancelDiscovery() before attempting a connection。

连接设备之前,要调用cancelDiscovery(),以便节约资源。

另外,需要取消广播:

    @Override
    protected void onDestroy() {
        unregisterReceiver(mReceiver);
        super.onDestroy();
    }

第五步:设备的可发现时间设定,默认是120S。

Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivity(discoverableIntent);
时间: 2024-09-29 05:21:53

Android Developer -- Bluetooth篇 开发实例之一的相关文章

Android Developer -- Bluetooth篇 开发实例之二

连接设备 In order to create a connection between your application on two devices, you must implement both the server-side and client-side mechanisms, because one device must open a server socket and the other one must initiate the connection (using the s

Android Developer -- Bluetooth篇 开发实例之四 为什么无线信号(RSSI)是负值?

原文:http://www.cnblogs.com/lele/articles/2832885.html 为什么无线信号(RSSI)是负值 答:其实归根到底为什么接收的无线信号是负值,这样子是不是容易理解多了.因为无线信号多为mW级别,所以对它进行了极化,转化为dBm而已,不表示信号是负的.1mW就是0dBm,小于1mW就是负数的dBm数. 弄清信号强度的定义就行了: RSSI(接收信号强度)Received Signal Strength IndicatorRss=10logP,只需将接受到的

Android Developer -- Bluetooth篇 开发实例之六 蓝牙RSSI计算距离

计算公式: d = 10^((abs(RSSI) - A) / (10 * n)) 其中: d - 计算所得距离 RSSI - 接收信号强度(负值) A - 发射端和接收端相隔1米时的信号强度 n - 环境衰减因子 计算公式的代码实现 - (float)calcDistByRSSI:(int)rssi { int iRssi = abs(rssi); float power = (iRssi-59)/(10*2.0); return pow(10, power); } 传入RSSI值,返回距离(

Bluetooth篇 开发实例之九 和蓝牙模块通信

首先,我们要去连接蓝牙模块,那么,我们只要写客户端的程序就好了,蓝牙模块就相当于服务端. 连接就需要UUID. #蓝牙串口服务SerialPortServiceClass_UUID = ‘{00001101-0000-1000-8000-00805F9B34FB}’ 第一步: 首先要连接设备.这个参考Android Developer的例子来写:Android Developer -- Bluetooth篇 开发实例之二 连接设备 private class ConnectThread exte

Bluetooth篇 开发实例之八 匹配

自己写的App匹配蓝牙设备,不需要通过系统设置去连接. 匹配和通信是两回事. 用过Android系统设置(Setting)的人都知道蓝牙搜索之后可以建立配对和解除配对,但是这两项功能的函数没有在SDK中给出.但是可以通过反射来获取. Method[] hideMethod2 =BluetoothDevice.class.getMethods(); int k = 0; for (; k < hideMethod2.length; k++) { Log.e("BluetoothDevice

Bluetooth篇 开发实例之七 匹配&amp;UUID

匹配和通信是两回事. 1.用过Android系统设置(Setting)的人都知道蓝牙搜索之后可以建立配对和解除配对,但是这两项功能的函数没有在SDK中给出.但是可以通过反射来获取. 知道这两个API的宿主(BluetoothDevice): /** * 与设备配对 参考源码:platform/packages/apps/Settings.git * /Settings/src/com/android/settings/bluetooth/CachedBluetoothDevice.java */

Android Developer -- Bluetooth篇 概述

Bluetooth 安卓平台支持蓝牙网络协议栈,它允许设备与其他蓝牙设备进行无线交换数据.应用程序框架通过安卓蓝牙APIs提供访问蓝牙功能.这些APIs使应用程序通过无线连接到其他蓝牙设备,使点对点和多点的无线功能. 使用蓝牙APIs,安卓应用程序可以执行以下功能: 扫描其他蓝牙设备 查询本地蓝牙适配器,用于配对蓝牙设备 建立RFCOMM通道 通过发现服务service discovery连接到其他设备 交换数据和其他设备 管理多个连接 The Basics 这个文档描述了如何使用Android

Bluetooth篇 开发实例之十一 官网的Bluetooth Chat sample的bug

当没有匹配的设备和没有找到可用设备的时候. // If there are paired devices, add each one to the ArrayAdapter if (pairedDevices.size() > 0) { findViewById(R.id.title_paired_devices).setVisibility(View.VISIBLE); for (BluetoothDevice device : pairedDevices) { mPairedDevicesA

Android系统Google Maps开发实例浅析

Google Map(谷歌地图)是Google公司提供的电子地图服务.包括了三种视图:矢量地图.卫星图片.地形地图.对于Android系统来说,可以利用Google提供的地图服务来开发自己的一些应用.Google Map的服务体现在两个方面:地图API和位置API.使用Android Maps API(地图API)和Android Location API(定位API)可以轻松实现实用而且强大的功能. 我的位置:“我的位置”在地图上显示你的当前位置(通常在 1000 米范围之内).即使没有 GP