Android 蓝牙学习笔记(一)

首先扯点别的:这是我自己看蓝牙方面的知识的笔记,要是大家想看蓝牙方面的知识,可以看看链接中的文章,我看了看,写的也是没谁了,完全是android官网的翻译加详解,非常完美!http://blog.csdn.net/small_lee/article/details/50800722

估计一篇文章也写不完,应该写两篇,先给大家上图

第一:这篇文章完成的任务

现在就按照图片按钮的顺序从头往下讲解。完整的代码在文章的末尾贴上。使用蓝牙方面的功能需要在Androidmanifest.xml文件中添加两个权限


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

1 打开蓝牙:在使用蓝牙之前,你首先要明确你的设备是否支持蓝牙功能,如果支持的话,你就可以打开蓝牙;

BluetoothAdapter bluetoothAdapter= BluetoothAdapter.getDefaultAdapter();
if (bluetoothAdapter == null) {
                    Toast.makeText(this, "你的手机不支持蓝牙功能", Toast.LENGTH_SHORT).show();
                } else {
                    //设备支持蓝牙,打开蓝牙
                    if (!bluetoothAdapter.isEnabled()) {
                        Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                        startActivityForResult(enableIntent, REQUEST_ENABLE_BT);
                    }
 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == REQUEST_ENABLE_BT) {
            if (resultCode == RESULT_OK) {
                Toast.makeText(this, "成功打开蓝牙", Toast.LENGTH_SHORT).show();
            } else if (resultCode == RESULT_CANCELED) {
                Toast.makeText(this, "打开蓝牙失败", Toast.LENGTH_SHORT).show();

            }
        }
    }

如果得到的mBluetoothAdapter 为空的话,就说明你的设备不支持蓝牙,如果不为空,就可以打开蓝牙。打开之前还要来一个判断蓝牙是否已经打开了。!bluetoothAdapter.isEnabled()如果没打开,就打开蓝牙。看点击打开蓝牙按钮后的效果图。点击以后在onActivityResult做一个toast如果成功,就弹出成功打开蓝牙,否则弹出失败

在弹出的对话框中点击允许,然后手机的状态栏上的蓝牙图标就出来了,成功打开。

2:查找已配对的设备:如果你的设备上的蓝牙曾经和别的设备上的蓝牙配对过,那么你可以查找到你曾经配对过的设备的设备名,MAC地址等信息

 //查找已配对的蓝牙设备
                if (bluetoothAdapter != null) {
                    Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();
                    // If there are paired devices
                    if (pairedDevices.size() > 0) {
                        // Loop through paired devices
                        for (BluetoothDevice device : pairedDevices) {
                            lists.add(device.getName() + ":" + device.getAddress());
                        }
                        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, lists);
                        listView.setAdapter(adapter);
                    } else {
                        Toast.makeText(this, "没有配对的蓝牙设备", Toast.LENGTH_SHORT).show();
                    }
                }

如果找到就显示在listView中,如果没有找到,就弹出一个提示,看效果如图

可以看到我曾经配对过一个设备 Lenovo S820 MAC地址是50:3C:C4:14:45

3:搜索设备 只要简单的调用BluetoothAdapter 的startDiscovery()方法就可以开始搜索附近的蓝牙设备。搜索过程是一个异步的过程,调用方法以后会立即返回一个boolean值用来指示搜索是否已经启动了。你需要注册一个广播接收器来得到搜索到的设备的相关信息。在oncreate()方法中注册

// Register the BroadcastReceiver
        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        registerReceiver(mReceiver, filter);

自定义广播接收器

 // Create a BroadcastReceiver for ACTION_FOUND
    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            // When discovery finds a device
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                Toast.makeText(MainActivity.this, "发现设备", Toast.LENGTH_SHORT).show();
                // 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
                lists.add(device.getName() + ":" + device.getAddress());
                adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, lists);
                listView.setAdapter(adapter);
            } else {
                Toast.makeText(MainActivity.this, "没有发现设备", Toast.LENGTH_SHORT).show();
            }
        }
    };

点击搜索设备后的效果图,我的另一部手机 LenovoS820必须打开蓝牙并设置可让其他设备检测到。

4关闭搜索,一行代码搞定

 //关闭搜索功能
                if (bluetoothAdapter != null && bluetoothAdapter.isEnabled()) {
                    bluetoothAdapter.cancelDiscovery();
                }

5 关闭蓝牙,一行代码搞定

 if (bluetoothAdapter != null && bluetoothAdapter.isEnabled()) {
                    bluetoothAdapter.disable();
                }

点击关闭蓝牙以后,手机状态栏中的蓝牙小图标会消失

6,设置蓝牙可发现:如果你是主动发起连接其他设备,不用设置此项,如果你是被动的被远端的设备发现的话就必须设置此项。如果你的蓝牙并没有打开的话,设置蓝牙可发现的时候会自动打开蓝牙。

Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
                discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, MY_DISCOVERABLE_TIME);//第二个参数是自定义的可检测的时间我定义的是1024秒,(如果超出此时间,则手机蓝牙不可被发现)
                 startActivityForResult(discoverableIntent, REQUEST_ENABLE_BT);

看图

当你点击允许的时候你的Activity中的onActivityResult()会收到一个回调,resultcode是你设置的蓝牙可检测的时间1024秒

if (requestCode == REQUEST_ENABLE_BT) {
             if (resultCode == MY_DISCOVERABLE_TIME) {
                Toast.makeText(this, "蓝牙设备可一被发现", Toast.LENGTH_SHORT).show();
                Log.e("TAG", "蓝牙设备可被发现");
            }
        }

看图

完整代码MainActivity.java activity_main.xml

package com.learnbluetooth;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
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.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.IllegalFormatCodePointException;
import java.util.List;
import java.util.Set;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private static final int REQUEST_ENABLE_BT = 1;
    private static final int MY_DISCOVERABLE_TIME = 1024;
    Button button1, button2, button3, button4, button5, button6;
    ListView listView;
    ArrayAdapter<String> adapter;
    List<String> lists = new ArrayList<>();
    BluetoothAdapter bluetoothAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button1 = (Button) findViewById(R.id.button1);
        button1.setOnClickListener(this);
        button2 = (Button) findViewById(R.id.button2);
        button2.setOnClickListener(this);
        button3 = (Button) findViewById(R.id.button3);
        button3.setOnClickListener(this);
        button4 = (Button) findViewById(R.id.button4);
        button4.setOnClickListener(this);
        button5 = (Button) findViewById(R.id.button5);
        button5.setOnClickListener(this);
        button6 = (Button) findViewById(R.id.button6);
        button6.setOnClickListener(this);
        listView = (ListView) findViewById(R.id.listView);
        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        // Register the BroadcastReceiver
        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        registerReceiver(mReceiver, filter);
    }

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

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button1:
                if (bluetoothAdapter == null) {
                    Toast.makeText(this, "你的手机不支持蓝牙功能", Toast.LENGTH_SHORT).show();
                } else {
                    //设备支持蓝牙,打开蓝牙
                    if (!bluetoothAdapter.isEnabled()) {
                        Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                        startActivityForResult(enableIntent, REQUEST_ENABLE_BT);
                    }
                }
                break;
            case R.id.button2:
                //查找已配对的蓝牙设备
                if (bluetoothAdapter != null) {
                    Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();
                    // If there are paired devices
                    if (pairedDevices.size() > 0) {
                        // Loop through paired devices
                        for (BluetoothDevice device : pairedDevices) {
                            lists.add(device.getName() + ":" + device.getAddress());
                        }
                        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, lists);
                        listView.setAdapter(adapter);
                    } else {
                        Toast.makeText(this, "没有配对的蓝牙设备", Toast.LENGTH_SHORT).show();
                    }
                }
                break;
            case R.id.button3:
                //搜索蓝牙
                if (bluetoothAdapter != null && bluetoothAdapter.isEnabled()) {
                    bluetoothAdapter.startDiscovery();
                }
                Toast.makeText(this, "正在搜索", Toast.LENGTH_SHORT).show();
                Log.e("TAG", "正在搜索");
                break;
            case R.id.button4:
                //关闭搜索功能
                if (bluetoothAdapter != null && bluetoothAdapter.isEnabled()) {
                    bluetoothAdapter.cancelDiscovery();
                }
                Toast.makeText(this, "关闭搜索", Toast.LENGTH_SHORT).show();
                Log.e("TAG", "关闭搜索");
                break;
            case R.id.button5:
                if (bluetoothAdapter != null && bluetoothAdapter.isEnabled()) {
                    bluetoothAdapter.disable();
                }
                break;
            case R.id.button6:
                Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
                discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, MY_DISCOVERABLE_TIME);
                startActivityForResult(discoverableIntent, REQUEST_ENABLE_BT);
                break;
            default:

                break;
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == REQUEST_ENABLE_BT) {
            if (resultCode == RESULT_OK) {
                Toast.makeText(this, "成功打开蓝牙", Toast.LENGTH_SHORT).show();
            } else if (resultCode == RESULT_CANCELED) {
                Toast.makeText(this, "打开蓝牙失败", Toast.LENGTH_SHORT).show();

            }else  if (resultCode == MY_DISCOVERABLE_TIME) {
                Toast.makeText(this, "蓝牙设备可被发现", Toast.LENGTH_SHORT).show();
                Log.e("TAG", "蓝牙设备可被发现");
            }
        }

    }

    // Create a BroadcastReceiver for ACTION_FOUND
    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            // When discovery finds a device
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                Toast.makeText(MainActivity.this, "发现设备", Toast.LENGTH_SHORT).show();
                // 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
                lists.add(device.getName() + ":" + device.getAddress());
                adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, lists);
                listView.setAdapter(adapter);
            } else {
                Toast.makeText(MainActivity.this, "没有发现设备", Toast.LENGTH_SHORT).show();
            }
        }
    };
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
>
    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="打开蓝牙" />
    <Button
        android:id="@+id/button2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="查找已配对的设备" />
    <Button
        android:id="@+id/button3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="搜索设备"/>
    <Button
        android:id="@+id/button4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="停止搜索"/>
    <Button
        android:id="@+id/button5"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="关闭蓝牙"/>
    <Button
        android:id="@+id/button6"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="设置蓝牙可发现"/>
    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"></ListView>

</LinearLayout>

行,下篇继续,刚吃完饭,有点小困,去睡个觉先。唉,感觉自己时间很少,还想多玩玩,多休息休息,所以写的东西质量简直是垃圾。等以后自己时间多了,知识更完备,再认真写东西。我就是IT行业的诗人,文艺界的IT男。此时此刻,我想到了通哥。

时间: 2024-10-28 10:47:45

Android 蓝牙学习笔记(一)的相关文章

java/android 设计模式学习笔记(14)---外观模式

这篇博客来介绍外观模式(Facade Pattern),外观模式也称为门面模式,它在开发过程中运用频率非常高,尤其是第三方 SDK 基本很大概率都会使用外观模式.通过一个外观类使得整个子系统只有一个统一的高层的接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节.当然,在我们的开发过程中,外观模式也是我们封装 API 的常用手段,例如网络模块.ImageLoader 模块等.其实我们在开发过程中可能已经使用过很多次外观模式,只是没有从理论层面去了解它. 转载请注明出处:http://bl

java/android 设计模式学习笔记(10)---建造者模式

这篇博客我们来介绍一下建造者模式(Builder Pattern),建造者模式又被称为生成器模式,是创造性模式之一,与工厂方法模式和抽象工厂模式不同,后两者的目的是为了实现多态性,而 Builder 模式的目的则是为了将对象的构建与展示分离.Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程.一个复杂的对象有大量的组成部分,比如汽车它有车轮.方向盘.发动机.以及各种各样的小零件,要将这些部件装配成一辆汽车,这个装配过

java/android 设计模式学习笔记(一)---单例模式

前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使用的时候也会有一些坑. PS:对技术感兴趣的同鞋加群544645972一起交流 设计模式总目录 java/android 设计模式学习笔记目录 特点 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的使用很广泛,比如:线程池(threadpool).缓存(cache).对

Android NDK学习笔记(一) 为什么要用NDK?

NDK是什么 NDK是Native Development Kit的简称,即本地开发工具包.通过NDK,Android允许开发人员使用本地代码语言(例如C/C++)来完成应用的部分(甚至全部)功能.注意:由于翻译原因,有些地方也把Native翻译为"原生". NDK是SDK的一个补充,可以帮助你做这些事情: 生成可以在ARM CPU,Android 1.5(及以上)平台运行的JNI兼容的共享库. 将生成的共享库放置在应用程序项目路径的合适位置,使其能自动地添加进你最终的(和经过签名的)

Android:日常学习笔记(8)———探究UI开发(5)

Android:日常学习笔记(8)---探究UI开发(5) ListView控件的使用 ListView的简单用法 public class MainActivity extends AppCompatActivity { private String[] data={"Apple","Banana","Orange","Watermelon","Pear","Grape","

java/android 设计模式学习笔记(7)---装饰者模式

这篇将会介绍装饰者模式(Decorator Pattern),装饰者模式也称为包装模式(Wrapper Pattern),结构型模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是继承关系的一种替代方案之一,但比继承更加灵活.在现实生活中也可以看到很多装饰者模式的例子,或者可以大胆的说装饰者模式无处不在,就拿一件东西来说,可以给它披上无数层不一样的外壳,但是这件东西还是这件东西,外壳不过是用来扩展这个东西的功能而已,这就是装饰者模式,装饰者的这个角色也许各不相同但是被装饰的对

疯狂Android讲义 - 学习笔记(四)

Android应用通常有多个Activity,多个Activity组成Activity栈,当前活动的Activity位于栈顶.Activity相当于Java Web开发的Servlet.当Activity处于Android应用运行时,同样受系统控制.有生命周期. 4.1 建立.配置和使用Activity 4.1.1 Activity 建立自己的Activity需要集成Activity基类,在不同的应用场景,有时也能集成Activity的子类. Activity间接或直接继承了Context.Co

Android:日常学习笔记(10)———使用LitePal操作数据库

Android:日常学习笔记(10)---使用LitePal操作数据库 引入LitePal 什么是LitePal LitePal是一款开源的Android数据库框架,采用了对象关系映射(ORM)的模式,将平时开发时最常用的一些数据库功能进行了封装,使得开发者不用编写一行SQL语句就可以完成各种建表.増删改查的操作.并且LitePal很"轻",jar包大小不到100k,而且近乎零配置,这一点和Hibernate这类的框架有很大区别.目前LitePal的源码已经托管到了GitHub上. 关

java/android 设计模式学习笔记(13)---享元模式

这篇我们来介绍一下享元模式(Flyweight Pattern),Flyweight 代表轻量级的意思,享元模式是对象池的一种实现.享元模式用来尽可能减少内存使用量,它适合用于可能存在大量重复对象的场景,缓存可共享的对象,来达到对象共享和避免创建过多对象的效果,这样一来就可以提升性能,避免内存移除和频繁 GC 等. 享元模式的一个经典使用案例是文本系统中图形显示所用的数据结构,一个文本系统能够显示的字符种类就是那么几十上百个,那么就定义这么些基础字符对象,存储每个字符的显示外形和其他的格式化数据