`
nanjingjiangbiao_T
  • 浏览: 2598939 次
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Android开发--蓝牙操作

 
阅读更多

首先,由于模拟器上没有蓝牙装置,所以我们需要一个含有蓝牙装置的Android系统

其次,要操作设备上的蓝牙装置,需要在AndroidManifest中声明两个权限:

  1. <uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN"/>
  2.   <uses-permissionandroid:name="android.permission.BLUETOOTH"/>
第一个权限称为“蓝牙管理”,是对蓝牙的可见性设置,扫描装置,关闭等操作所设置的

第二个权限是普通的“蓝牙操作权限”,可以操作对蓝牙的打开,搜索配对设备等操作


BluetoothAdapter
  本地的蓝牙适配器。该类主要用来操作蓝牙的基本服务。比如:初始化设备的可见,查询可匹配的设备集,使用一个已知的MAC地址来初始化一个BluetoothDevice类(远程蓝牙装置),创建一个BluetoothServerSocket类以监听其它设备对本机的连接请求等。

BluetoothDevice
  该类是一个远程蓝牙设备。我们可以创建一个带有各自设备的BluetoothDevice或者查询其皆如名称、地址、类和连接状态等信息。

配置本机蓝牙模块

在这里首先要了解对蓝牙操作一个核心类BluetoothAdapter

01 BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
02 //直接打开系统的蓝牙设置面板
03 Intent intent =newIntent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
04 startActivityForResult(intent,0x1);
05 //直接打开蓝牙
06 adapter.enable();
07 //关闭蓝牙
08 adapter.disable();
09 //打开本机的蓝牙发现功能(默认打开120秒,可以将时间最多延长至300秒)
10 discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,300);//设置持续时间(最多300秒)Intent discoveryIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);

搜索蓝牙设备

使用BluetoothAdapter的startDiscovery()方法来搜索蓝牙设备

startDiscovery()方法是一个异步方法,调用后会立即返回。该方法会进行对其他蓝牙设备的搜索,该过程会持续12秒。该方法调用后,搜索过程实际上是在一个System Service中进行的,所以可以调用cancelDiscovery()方法来停止搜索(该方法可以在未执行discovery请求时调用)。

请求Discovery后,系统开始搜索蓝牙设备,在这个过程中,系统会发送以下三个广播:

ACTION_DISCOVERY_START:开始搜索

ACTION_DISCOVERY_FINISHED:搜索结束

ACTION_FOUND:找到设备,这个Intent中包含两个extra fields:EXTRA_DEVICE和EXTRA_CLASS,分别包含BluetooDevice和BluetoothClass。

我们可以自己注册相应的BroadcastReceiver来接收响应的广播,以便实现某些功能

01 // 创建一个接收ACTION_FOUND广播的BroadcastReceiver
02 privatefinalBroadcastReceiver mReceiver =newBroadcastReceiver() {
03 publicvoidonReceive(Context context, Intent intent) {
04 String action = intent.getAction();
05 // 发现设备
06 if(BluetoothDevice.ACTION_FOUND.equals(action)) {
07 // 从Intent中获取设备对象
08 BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
09 // 将设备名称和地址放入array adapter,以便在ListView中显示
10 mArrayAdapter.add(device.getName() +"\n"+ device.getAddress());
11 }
12 }
13 };
14 // 注册BroadcastReceiver
15 IntentFilter filter =newIntentFilter(BluetoothDevice.ACTION_FOUND);
16 registerReceiver(mReceiver, filter);// 不要忘了之后解除绑定
下面,以一个具体的实例总结上述内容:

实例的截图如下所示:


程序中实现了蓝牙的打开,扫描已经配对的蓝牙装置,设置设备的可见性(时间设置),扫描周围的蓝牙设备(10米范围内),关闭蓝牙操作。

具体的实现代码如下:

public class MainActivity extends Activity {
	private Button button;
	private Button button2;
	private Button button3;
	private Button button4;
	private Button button5;
	private BluetoothAdapter adapter;
	private BluetoothReceiver bluetoothReceiver;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		button=(Button)findViewById(R.id.button);
		button2=(Button)findViewById(R.id.button1);
		button3=(Button)findViewById(R.id.button_display);
		button4=(Button)findViewById(R.id.button_scan);
		button5=(Button)findViewById(R.id.button_open);
		
		//获取设备的蓝牙设备,如果没有则返回null
	    adapter=BluetoothAdapter.getDefaultAdapter();
	    //设置过滤器,用于发现远程蓝牙设备
		IntentFilter intentFilter=new IntentFilter(BluetoothDevice.ACTION_FOUND);
		//生成广播接收对象,当有蓝牙设备被发现时,Android系统发出广播事件
		bluetoothReceiver=new BluetoothReceiver();
		//注册广播监听器
		registerReceiver(bluetoothReceiver, intentFilter);
		
		//获取已经配对的蓝牙设备,设备的信息存储在内存中
		button.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				//获取本机的蓝牙设备,如果不存在蓝牙设在则返回空
				BluetoothAdapter adapter=BluetoothAdapter.getDefaultAdapter();
				//测试本机是否存在蓝牙设备
				if(adapter!=null){
					//获取已经连接的蓝牙设备,即存在已经连接过了的远程蓝牙设备
					Set<BluetoothDevice> devices=adapter.getBondedDevices();
					if (devices.size()>0) {
						for(Iterator<BluetoothDevice> iterator=devices.iterator();iterator.hasNext();){
							BluetoothDevice bluetoothDevice=(BluetoothDevice)iterator.next();
							Log.d("BruceZhang",bluetoothDevice.getAddress());
						}
					}
				}
				else {
					Log.d("BruceZhang", "此设备不存在蓝牙设备。。。");
				}
			}
		});
		
		//关闭蓝牙的操作
		button2.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				BluetoothAdapter adapter=BluetoothAdapter.getDefaultAdapter();
				if (adapter!=null) {
					if(adapter.isEnabled()){
						adapter.disable();
						Log.d("BruceZhang", "设备关闭中。。。");
					}
					else {
						Log.d("BruceZhang", "设备已经关闭,不需再进行操作。。。");
					}
				}
				else {
					Log.d("BruceZhang", "此设备不存在蓝牙设备。。。");
				}
			}
		});
		
		/*
		 * 蓝牙的可见性设置
		 * 1.设置的本地设备的可见性,即能否被其他的蓝牙设备扫描到
		 * 2.蓝牙可见的持续时间默认是120秒,这里修改为180秒,以作为参考
		 */
		button3.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				Intent discoverableIntent = new  Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);  
				discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 180);  
				startActivity(discoverableIntent);  
			}
		});
		
		//本地蓝牙设备扫描远程蓝牙设备
//		使用BluetoothAdapter的startDiscovery()方法来搜索蓝牙设备
//		startDiscovery()方法是一个异步方法,调用后会立即返回。该方法会进行对其他蓝牙设备的搜索,该过程会持续12秒。
//		该方法调用后,搜索过程实际上是在一个System Service中进行的,
//		所以可以调用cancelDiscovery()方法来停止搜索(该方法可以在未执行discovery请求时调用)。
//		请求Discovery后,系统开始搜索蓝牙设备,在这个过程中,系统会发送以下三个广播:
//		ACTION_DISCOVERY_START:开始搜索
//		ACTION_DISCOVERY_FINISHED:搜索结束
//		ACTION_FOUND:找到设备,这个Intent中包含两个extra fields:
//		EXTRA_DEVICE和EXTRA_CLASS,分别包含BluetooDevice和BluetoothClass。
		button4.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				//当发现蓝牙设备后会发出广播通知
				adapter.startDiscovery();
				Log.d("BruceZhang", "正在扫描可见的蓝牙设备。。。");
			}
		});
		
		//打开蓝牙设备
		button5.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				if (adapter!=null) {
					if (!adapter.isEnabled()) {
						final Intent intent=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
						startActivity(intent);
						Log.d("BruceZhang", "蓝牙设备正在打开。。。");
					}
				}
				else {
					Log.d("BruceZhang", "此设备不存在蓝牙。。。");
				}
			}
		});
		
	}
	
	//广播接收器,当远程蓝牙设备被发现时,回调函数onReceiver()会被执行
	private class BluetoothReceiver extends BroadcastReceiver{

		@Override
		public void onReceive(Context context, Intent intent) {
			// TODO Auto-generated method stub
			if (BluetoothDevice.ACTION_FOUND.equals(intent.getAction())) {
				BluetoothDevice device=intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
				Log.d("BruceZhang", "扫描到可连接的蓝牙设备:"+device.getAddress());
			}
		}
		
	} 

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		unregisterReceiver(bluetoothReceiver);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.activity_main, menu);
		return true;
	}

}


分享到:
评论

相关推荐

    Node.js-AndroidBLE蓝牙开发框架

    Android BLE 蓝牙开发框架,使用回调方式处理,搜索、连接、notify、indicate、读、写等一系列蓝牙操作

    android蓝牙通信开发-蓝牙聊天

    基于Android平台的一个关于应用蓝牙设备进行聊天的程序,目前程序已实现2台设备之间的通信,服务器部分是按照的一对多的方式写的```没有测试3台设备是否能聊天,不过2台设备配对后``是百分百可以的,有UI界面,操作简单,...

    389273716#android-skill-summary#蓝牙技能1

    蓝牙以及硬件开发技能android Ble开发的那些事(三)--Ble数据分包处理 - 简书Android 传感器开发 完全解析蓝牙操作库Android Thi

    老罗android开发视频教程全集百度网盘下载

    Android 是Google开发的基于Linux平台的开源手机操作系统。它包括操作系统、用户界面和应用程序—— 移动电话工作所需的全部软件,而且不存在任何...【第一版第十五章】老罗Android开发视频--百度地图实战开发(10集)

    Android 蓝牙BLE全面解析以及智能车锁开发实例

    Android 蓝牙BLE全面解析以及智能车锁开发实例一、蓝牙BLE产生背景——蓝牙的发展历程 二、蓝牙BLE的基本概念 三、蓝牙BLE的架构介绍 1. 蓝牙BLE架构概览 2. 简述BLE如何发送数据包 2.1 广播方式 2.2 连接方式 四、...

    Node.js-androidBLE蓝牙框架

    android BLE蓝牙框架,包括扫描、连接、设置通知、发送数据、读取和接收数据以及各种直观的回调,近乎一行代码植入项目,可扩展配置蓝牙相关操作。

    Android蓝牙开发客户端代码

    Android蓝牙开发客户端代码,必须配合服务器端进行操作,

    [14本经典Android开发教程]-3-Android SDK 中文开发文档

    [14本经典Android开发教程]-3-Android SDK 中文开发文档 什么是 Android? Android 是一个专门针对移动设备的软件集,它包括一个操作系统,中间件和一些重要的应用程序。Beta版的 Android SDK 提供了在Android 平台上...

    基于Android系统的蓝牙遥控APP

    用于连接小车上的蓝牙模块,实现对小车的遥控。这个APP是通过JAVA代码...小车蓝牙和手机端成功完成配对,使用手机APP上的键盘控制给小车发送指令,小车上的芯片收到了指令后进行处理,最后小车能够完成对应指令的操作。

    Android开发蓝牙耳机按键监听(蓝牙监听应用测试)demo-(手机连接蓝牙耳机后可通过蓝牙音量键远程控制手机执行操作)

    Android开发蓝牙耳机按键监听(蓝牙监听应用测试)demo-(手机连接蓝牙耳机后可通过蓝牙音量键远程控制手机执行操作)

    新版Android开发教程.rar

    这一联盟将会支持 Google 发布的 Android 手机操作系统或者应用软件,共同开发名为 Android 的 开 放源代码的移动系统。开放手机联盟包括手机制造商、手机芯片厂商和移动运营商几类。目前,联盟成员 数 量已经达到了...

    Kotlin+Android 蓝牙基本操作

    采用kotlin 对蓝牙进行打开和关闭,以及搜索蓝牙设备,与其他蓝牙设备配对,并将所有配对的信息进行显示。相关说明看 https://mp.csdn.net/mp_blog/creation/editor/119547298

    android开发揭秘PDF

    第1章 Android开发简介 1.1 Android基本概念 1.1.1 Android简介 1.1.2 Android的系统构架 1.1.3 Android应用程序框架 1.2 OMS介绍 1.2.1 OPhone介绍 1.2.2 Widget介绍 1.3 小结 第2章 Android开发环境搭建 2.1 ...

    QT5 蓝牙开发文档翻译整理

    本文档翻译了QT蓝牙章节的一些技术资料,开发蓝牙必备。经过实际开发测试,QT5的蓝牙API可以直接操作Android手机的蓝牙,可以实现基本蓝牙通信,比如 实现手机与HC-05蓝牙通信等。

    Android代码-BleLib

    BleLib 是 Android 低功耗蓝牙 4.0 及以上开发的辅助库,一行代码解决 Ble 初始化、扫描、连接、特性读写、设置通知等操作。 BleLib 中的关键类: BleService 是单个 Ble 连接操作的服务类 GattAttributes 类中...

    Android高级编程--源代码

    因为没有了人为制造的障碍,所以Android开发人员可以自由地编写能够充分利用日益强大的手机硬件的应用程序。因此,对Android感兴趣的开发人员都把Google在2008年发布Android这一举措作为移动技术发展史上的一个非常...

    Android代码-FastBle

    使用回调方式处理:搜索、连接、读写、通知等一系列蓝牙操作。每一个characteristic会与一个callback形成一一对应的监听关系。 Update Log v1.1.1(2017-05-04) 优化连接异常中断后的扫描及重连机制;优化测试...

    RN与Android蓝牙插件开发

    注要是提供蓝牙插件,功能有蓝牙列表,连接,修改蓝牙value

    手机端蓝牙的操作

    android端移动开发的蓝牙的开发,及其配置,蓝牙打开,蓝牙扫描,蓝牙关闭等一系列操作,很全面

    android通用蓝牙调试助手

    android 好用的ble蓝牙调试助手,方便操作,查看服务的UUID

Global site tag (gtag.js) - Google Analytics