博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android Studio第三十三期 - 蓝牙开发初识~
阅读量:6180 次
发布时间:2019-06-21

本文共 5546 字,大约阅读时间需要 18 分钟。

    遇见到坑爹的队友只有接受现实并且解决问题~

    

    首先介绍一下网上几乎所有的能搜到的方法:

    1.首先,要操作蓝牙,先要在AndroidManifest.xml里加入权限

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

    2.在android.bluetooth包下就这些能用的东西:

    3.我们一般用的是BluetoothAdapter基本就可以实现需求了:

      cancelDiscovery() :取消发现,也就是说当我们正在搜索设备的时候调用这个方法将不再继续搜索

      disable():关闭蓝牙

      enable():打开蓝牙,这个方法打开蓝牙不会弹出提示,更多的时候我们需要问下用户是否打开,一下这两行代码同样是打开蓝牙,不过会提示用户:

1
2
3
4
5
6
7
8
9
//打开蓝牙
if 
(!mBluetoothAdapter.isEnabled()) {
    
Intent intent1 = 
new 
Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    
startActivityForResult(intent1, ENABLE_BLUE);
    
//不做提示,强行打开
    
// mAdapter.enable();
else 
{
    
close_blue();
}

    

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Override
protected 
void 
onActivityResult(
int 
requestCode, 
int 
resultCode, Intent data) {
    
// TODO Auto-generated method stub
    
super
.onActivityResult(requestCode, resultCode, data);
    
if 
(requestCode == ENABLE_BLUE) {
        
if 
(resultCode == RESULT_OK) {
            
Toast.makeText(
this
"蓝牙开启成功"
, Toast.LENGTH_SHORT).show();
            
open_blue();
        
else 
if 
(resultCode == RESULT_CANCELED) {
            
Toast.makeText(
this
"蓝牙开始失败"
, Toast.LENGTH_SHORT).show();
            
close_blue();
        
}
    
}
}

      getAddress():获取本地蓝牙地址

      getDefaultAdapter():获取默认BluetoothAdapter,实际上,也只有这一种方法获取BluetoothAdapter

      getName():获取本地蓝牙名称

      getRemoteDevice(String address):根据蓝牙地址获取远程蓝牙设备

      getState():获取本地蓝牙适配器当前状态(感觉可能调试的时候更需要)

      isDiscovering():判断当前是否正在查找设备,是返回true

      isEnabled():判断蓝牙是否打开,已打开返回true,否则,返回false

     listenUsingRfcommWithServiceRecord(String name,UUID uuid):根据名称,UUID创建并返回BluetoothServerSocket,这是创建BluetoothSocket服务器端的第一步

      startDiscovery():开始搜索,这是搜索的第一步

    4.使设备能够被搜索:

    首先判断初始状态:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//本机设备被扫描初始状态bufen
if 
(mBluetoothAdapter.getScanMode() == 
23
) {
    
//开启状态设置bufen
            
//开启操作
        
//弹窗
//                    Intent intent = new Intent(
//                            BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
//                    //设置蓝牙可见性的时间,方法本身规定最多可见300秒
//                    intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, BLUE_TIME);
//                    startActivityForResult(intent, SEARCH_BLUE);
        
//不弹窗
        
SettingblueUtils.setDiscoverableTimeout(
120
);
        
shezhi_blue_research(
true
);
        
new 
Handler().postDelayed(
new 
Runnable() {
            
@Override
            
public 
void 
run() {
                
closeDiscoverableTimeout();
                
shezhi_blue_research(
false
);
            
}
        
}, 
120
1000
);
else 
if 
(mBluetoothAdapter.getScanMode() == 
21
) {
    
//关闭状态设置bufen
    
closeDiscoverableTimeout();
}

    然后设置代码部分:

    开启:

1
2
3
4
5
6
7
8
9
10
11
12
13
public 
static 
void 
setDiscoverableTimeout(
int 
timeout) {
    
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
    
try 
{
        
Method setDiscoverableTimeout = BluetoothAdapter.
class
.getMethod(
"setDiscoverableTimeout"
int
.
class
);
        
setDiscoverableTimeout.setAccessible(
true
);
        
Method setScanMode = BluetoothAdapter.
class
.getMethod(
"setScanMode"
int
.
class
int
.
class
);
        
setScanMode.setAccessible(
true
);
        
setDiscoverableTimeout.invoke(adapter, timeout);
        
setScanMode.invoke(adapter, BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE, timeout);
    
catch 
(Exception e) {
        
e.printStackTrace();
    
}
}

    关闭:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public 
static 
void 
closeDiscoverableTimeout() {
    
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
    
try 
{
        
Method setDiscoverableTimeout = BluetoothAdapter.
class
.getMethod(
"setDiscoverableTimeout"
int
.
class
);
        
setDiscoverableTimeout.setAccessible(
true
);
        
Method setScanMode = BluetoothAdapter.
class
.getMethod(
"setScanMode"
int
.
class
int
.
class
);
        
setScanMode.setAccessible(
true
);
 
        
setDiscoverableTimeout.invoke(adapter, 
1
);
        
setScanMode.invoke(adapter, BluetoothAdapter.SCAN_MODE_CONNECTABLE, 
1
);
    
catch 
(Exception e) {
        
e.printStackTrace();
    
}
}

    

    5.抓取蓝牙列表List的方法:

1
2
3
4
5
6
// 获取所有已经绑定的蓝牙设备
Set<BluetoothDevice> devices = mBluetoothAdapter.getBondedDevices();
List<BluetoothDevice> mList1 = 
new 
ArrayList<>();
if 
(devices.size() > 
0
) {
    
mList1 = 
new 
ArrayList<>(devices);
}

   

    6.注册搜索蓝牙receiver:

1
2
3
4
5
6
IntentFilter mFilter = 
new 
IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
mFilter.addAction(BluetoothDevice.ACTION_FOUND);
mFilter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
mFilter.addAction(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED);
mFilter.addAction(BluetoothA2dp.ACTION_PLAYING_STATE_CHANGED);
registerReceiver(mReceiver, mFilter);

    

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
private 
BroadcastReceiver mReceiver = 
new 
BroadcastReceiver() {
 
    
@Override
    
public 
void 
onReceive(Context context, Intent intent) {
        
// TODO Auto-generated method stub
        
String action = intent.getAction();
        
// 获得已经搜索到的蓝牙设备
        
if 
(action.equals(BluetoothDevice.ACTION_FOUND)) {
            
BluetoothDevice device11 = intent
                    
.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            
// 搜索到的不是已经绑定的蓝牙设备
            
if 
(!is_shebei_open) {
                
receiver1(device11);
            
else 
{
                
receiver11(device11);
            
}
            
/**当绑定的状态改变时*/
        
else 
if 
(action.equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED)) {
            
BluetoothDevice device22 = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            
receiver2(device22, MainActivity_BlueTooth.
this
);
        
else 
if 
(action.equals(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)) {
            
receiver3();
        
else 
if 
(action.equals(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED)) {
            
int 
state = intent.getIntExtra(BluetoothA2dp.EXTRA_STATE, BluetoothA2dp.STATE_DISCONNECTED);
            
receiver4(state);
        
else 
if 
(action.equals(BluetoothA2dp.ACTION_PLAYING_STATE_CHANGED)) {
            
int 
state = intent.getIntExtra(BluetoothA2dp.EXTRA_STATE, BluetoothA2dp.STATE_NOT_PLAYING);
            
receiver5(state);
        
}
    
}
};

 

    最后说一下,多连接目前还没有解决,个人试了很多方法,大家如果有方法告诉我,谢谢~

本文转自 吴雨声 51CTO博客,原文链接:http://blog.51cto.com/liangxiao/1905941,如需转载请自行联系原作者
你可能感兴趣的文章
4、跃进表
查看>>
JAVA面向对象的总结(静态函数与static关键字)
查看>>
课堂作业第四周课上作业一
查看>>
使用Java语言开发微信公众平台(七)——音乐消息的回复
查看>>
陶哲轩实分析习题9.1.6
查看>>
常用音频软件:Cool edit pro
查看>>
努力的方向,除了诗和远方,还有一堆技术。
查看>>
SQL CHECK 约束
查看>>
git提交到一半关闭时
查看>>
WMware 10 Ubuntu 12.04 进入Unity模式
查看>>
简单通用的访问CVS的方法
查看>>
kbengine mmo源码(完整服务端源码+资源+完整客户端源码)
查看>>
【操作系统】实验四 主存空间的分配和回收
查看>>
Log4j 配置 的webAppRootKey参数问题
查看>>
VMware ESXi 5.0中时间配置中NTP设置
查看>>
C++中memset()函数笔记
查看>>
oracle sql 数结构表id降序
查看>>
使用cnpm加速npm
查看>>
MySql跨服务器备份数据库
查看>>
一个字典通过dictionaryWithDictionary 他们的内存指针是不同的
查看>>