• 基于Android 6.0 的蓝牙开发(1)-- 开启,关闭,搜索,连接


     一、注册蓝牙操作的相关权限

    1、注册权限需要在AndroidManifest.xml中注册:

    2、进行蓝牙权限注册

    在这里我注册了四个蓝牙相关的权限:

       <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
       <uses-permission android:name="android.permission.BLUETOOTH" />    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />    <uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION" />

    在这里解释一下这四个权限的作用:

    android.permission.BLUETOOTH:允许程序连接到已配对的蓝牙设备,用于连接或传输数据等配对后的操作。

    android.permission.BLUETOOTH_ADMIN:此权限是以注册“android.permission.BLUETOOTH”为前提的,作用是允许程序发现或配对蓝牙设备

    由于Android 6.0之后采用了新的权限机制来保护用户隐私,因此需要另外添加android.permission.ACCESS_FINE_LOCATIONandroid.permission.ACCESS_COARSE_LOCATION权限

    二、获取蓝牙设备器

    BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

    使用getDefaultAdapter()返回一个BluetoothAdapter的实例。

    三、开启蓝牙

    protected void openBluetooth() {
            if (!bluetoothAdapter.isEnabled()) {
                //向用户发出请求,开启蓝牙设备
                Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                startActivityForResult(intent, 1);
            }else{
                Toast.makeText(this, "蓝牙已开启,请勿重复点击!", Toast.LENGTH_SHORT).show();
            }
        }

    isEnable()判断蓝牙是否开启,若已开启返回true,反之则返回false。

    ACTION_REQUEST_ENABLE是蓝牙相关广播的action值,用于请求用户选择是否打开蓝牙。

    四、关闭蓝牙

        protected void closeBluetooth() {
            if (bluetoothAdapter.isEnabled()) {
                bluetoothAdapter.disable();
                Toast.makeText(MainActivity.this, "已关闭蓝牙", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(MainActivity.this, "蓝牙已关闭,请勿重复点击!", Toast.LENGTH_SHORT).show();
            }
        }

    关闭蓝牙的操作和开启蓝牙的操作差不多,这里用到的disable()用来强制关闭蓝牙。

    五、搜索蓝牙设备

    1、定义两个数组用来存放蓝牙设备的信息:

    public ArrayList<String> arrayList = nullpublic ArrayList<String> deviceName = null;
    arrayList = new ArrayList<>();
    deviceName = new ArrayList<>();

    其中,arrayList用来存放蓝牙设备地址,deviceName用来存放蓝牙设备的名称和地址并且在列表中显示。

    2、定义列表:此控件的使用需要用到为列表控件设置适配器,代码如下:

    public  static ArrayAdapter adapter = null;
    ListView listView;
    adapter = new ArrayAdapter(this, android.R.layout.simple_expandable_list_item_1, deviceName);
    listView = (ListView) findViewById(R.id.act_main_list);
    listView.setAdapter(adapter);

     若没有为列表设置适配器,列表在搜索时将无法显示出查找到的蓝牙设备。

    3、注册广播

        private void registerReceiver() {
            IntentFilter filter = new IntentFilter();
            filter.addAction(BluetoothDevice.ACTION_FOUND);
            filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
            registerReceiver(bluetoothReceiver, filter);
        }

    4、创建广播接收器,用于接受发现蓝牙设备和查找完成的广播

    private final BroadcastReceiver bluetoothReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                    BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                    deviceName.add("设备名:" + device.getName() + "
    " + "设备地址:" + device.getAddress() + "
    ");//将搜索到的蓝牙名称和地址添加到列表。
                    arrayList.add(device.getAddress());//将搜索到的蓝牙地址添加到列表。
                    adapter.notifyDataSetChanged();//更新
                }
            }
        };

     5、搜索蓝牙

    protected void findBluetooth() {
            registerReceiver();
            bluetoothAdapter.startDiscovery();
            Toast.makeText(this, "搜索中...请稍后", Toast.LENGTH_SHORT).show();
        }

     这里使用startDiscovery()来搜索设备,且只能搜索到开启了可见性的蓝牙设备。
           

    6、以上的开启蓝牙、关闭蓝牙和搜索蓝牙可以通过三个按钮点击事件来实现。

    进入activity_main.xml中设置三个按钮控件

    设置按钮控件代码如下:

    <Button
                android:id="@+id/open"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="开启蓝牙"/>
    
    <Button
                android:id="@+id/close"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="关闭蓝牙"/>
    
    <Button
                android:id="@+idfind"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="搜索蓝牙"/>

    然后再回到MainActivity中进行代码的编写:

     以下代码为给三个按钮分别设置打开,关闭和搜索蓝牙三个事件。

        public void myClick(View view){
            switch (view.getId()){
                case R.id.open:
                    openBluetooth();
                    break;
                case R.id.close:
                    closeBluetooth();
                    break;
                case R.id.find:
                    findBluetooth();
                    break;
            }
        }

    7、连接蓝牙设备

    注意:蓝牙设备的连接的整个过程需子线程中执行!

    作为客户端连接:(每个设备作为一个客户端去连接一个服务端,向对方发起连接)

    a、设置列表点击事件(点击后完成 b 步骤并且启动线程)

    b、往线程类中传入传入BluetoothDevice的对象。此对象的值由存放远程设备的地址的集合类传入。

    public static Context context;
    public static Context mge;
    public static BluetoothDevice device;
    BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
    device = adapter.getRemoteDevice(arrayList.get(i));
    clientThread = new ClientThread(device, mge, context);
    clientThread.start();

    c、使用a中获取的BluetoothDevice的对象来获取BluetoothSocket的对象(在线程类中)

    socket = (BluetoothSocket) device.getClass().getDeclaredMethod("createRfcommSocket", new Class[]{int.class}).invoke(device, 1);

    d、建立连接(必须先取消扫描蓝牙设备再进行连接)

    bluetoothAdapter.cancelDiscovery();                
    socket.connect();//连接

     文章到这里,蓝牙设备的开启,关闭,搜索与连接完成啦!这是本人第一次写博客,若有不足之处请大家指正!

     下篇文章我将写如何利用蓝牙发送数据与接收远端设备的数据,并将收到的数据进行处理实现实时改变色板的颜色。

  • 相关阅读:
    mysql聚合函数
    轮播图与定时器
    3.23 参数 DOM 鼠标点击跟移入事件
    循环+数组
    for循环
    JS讲解跟遇到的问题
    CSS标签和属性回顾,JS初步了解
    2018.03.14理工大网站问题及解决办法
    2018.3.13 浮动 定位
    2018.3.12CSS样式
  • 原文地址:https://www.cnblogs.com/Somture478/p/11140886.html
Copyright © 2020-2023  润新知