Android 蓝牙可见性开启与关闭

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 蓝牙可见性开启与关闭相关的知识,希望对你有一定的参考价值。

参考技术A

最初尝试了下面的方法,但是有时间限制而且需要手动确认:

后来,发现调用反射方法开启蓝牙可见性,可以到达预期效果,如下:

关闭可见性方法:

欢迎访问Github项目获取更多内容:

https://github.com/MickJson

欢迎点赞/评论,你们的赞同和鼓励是我写作的最大动力!

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

 

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

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() + "\\n" + "设备地址:" + device.getAddress() + "\\n");//将搜索到的蓝牙名称和地址添加到列表。
                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();//连接

 

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

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

 

以上是关于Android 蓝牙可见性开启与关闭的主要内容,如果未能解决你的问题,请参考以下文章

三星翻盖手机如何关闭蓝牙

您是不是使用 Java 中的默认(包)可见性? [关闭]

Android View的可见性检查之 getLocalVisibleRect(rect) 与 getGlobalVisibleRect(rect)

如何保存可见性android

Ruby 方法可见性:未定义的方法? [关闭]

Android安全与隐私相关特性的行为变更分析