`

android之蓝牙开发

阅读更多

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

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


 然后,看下api,Android所有关于蓝牙开发的类都在android.bluetooth包下,只有8个类,而我们需要用到了就只有几个而已:

1.BluetoothAdapter 顾名思义,蓝牙适配器,直到我们建立bluetoothSocket连接之前,都要不断操作它

BluetoothAdapter中的动作常量

ACTION_DISCOVERY_FINISHED 已完成蓝牙搜索 ACTION_DISCOVERY_STARTED 已经开始搜索蓝牙设备 ACTION_LOCAL_NAME_CHANGED 更改蓝牙的名字 ACTION_REQUEST_DISCOVERABLE 请求能够被搜索 ACTION_REQUEST_ENABLE 请求启动蓝牙 ACTION_SCAN_MODE_CHANGED 扫描模式已经改变 ACTION_STATE_CHANGED 状态已改变


 

BluetoothAdapter里的方法很多,常用的有以下几个:

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

  disable()关闭蓝牙

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

请求开启蓝牙

Intemtenabler=newIntent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(Intemtenabler,reCode);//同startActivity(enabler);


请求能够被搜索

Intemtenabler=newIntent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); startActivityForResult(Intemtenabler,reCode);//同startActivity(enabler);


 

 

 getAddress()获取本地蓝牙地址

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

  getName()获取本地蓝牙名称

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

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

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

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

  listenUsingRfcommWithServiceRecord(String name,UUID uuid)根据名称,UUID创建并返回

  BluetoothServerSocket,这是创建BluetoothSocket服务器端的第一步

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

BluetoothAdapter里的方法很多,常用的有以下几个:

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

      disable()关闭蓝牙

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

2.BluetoothDevice看名字就知道,这个类描述了一个蓝牙设备

      createRfcommSocketToServiceRecord(UUIDuuid)根据UUID创建并返回一个BluetoothSocket

这个方法也是我们获取BluetoothDevice的目的——创建BluetoothSocket

这个类其他的方法,如getAddress(),getName(),同BluetoothAdapter

3.BluetoothServerSocket如果去除了Bluetooth相信大家一定再熟悉不过了,既然是Socket,方法就应该都差不多,这个类一种只有三个方法

两个重载的accept(),accept(inttimeout)两者的区别在于后面的方法指定了过时时间,需要注意的是,执行这两个方法的时候,直到接收到了客户端的请求(或是过期之后),都会阻塞线程,应该放在新线程里运行!

还有一点需要注意的是,这两个方法都返回一个BluetoothSocket,最后的连接也是服务器端与客户端的两个BluetoothSocket的连接

close()这个就不用说了吧,翻译一下——关闭!

4.BluetoothSocket,跟BluetoothServerSocket相对,是客户端

一共5个方法,不出意外,都会用到

close(),关闭

connect()连接

getInptuStream()获取输入流

getOutputStream()获取输出流

getRemoteDevice()获取远程设备,这里指的是获取bluetoothSocket指定连接的那个远程蓝牙设备

5:搜索蓝牙设备

 

 

public class DiscoveryActivity  extends ListActivity
{
	private Handler _handler = new Handler();
	/* 取得默认的蓝牙适配器 */
	private BluetoothAdapter _bluetooth = BluetoothAdapter.getDefaultAdapter();
	/* 用来存储搜索到的蓝牙设备 */
	private List<BluetoothDevice> _devices = new ArrayList<BluetoothDevice>();
	/* 是否完成搜索 */
	private volatile boolean _discoveryFinished;
	private Runnable _discoveryWorkder = new Runnable() {
		public void run() 
		{
			/* 开始搜索 */
			_bluetooth.startDiscovery();
			for (;;) 
			{
				if (_discoveryFinished) 
				{
					break;
				}
				try 
				{
					Thread.sleep(100);
				} 
				catch (InterruptedException e){}
			}
		}
	};
	/**
	 * 接收器
	 * 当搜索蓝牙设备完成时调用
	 */
	private BroadcastReceiver _foundReceiver = new BroadcastReceiver() {
		public void onReceive(Context context, Intent intent) {
			/* 从intent中取得搜索结果数据 */
			BluetoothDevice device = intent
					.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
			/* 将结果添加到列表中 */
			_devices.add(device);
			/* 显示列表 */
			showDevices();
		}
	};
	private BroadcastReceiver _discoveryReceiver = new BroadcastReceiver() {

		@Override
		public void onReceive(Context context, Intent intent) 
		{
			/* 卸载注册的接收器 */
			unregisterReceiver(_foundReceiver);
			unregisterReceiver(this);
			_discoveryFinished = true;
		}
	};
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND, WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
		setContentView(R.layout.discovery);
		/* 如果蓝牙适配器没有打开,则结果 */
		if (!_bluetooth.isEnabled())
		{

			finish();
			return;
		}
		/* 注册接收器 */
		IntentFilter discoveryFilter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
		registerReceiver(_discoveryReceiver, discoveryFilter);
		IntentFilter foundFilter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
		registerReceiver(_foundReceiver, foundFilter);
		/* 显示一个对话框,正在搜索蓝牙设备 */
		SamplesUtils.indeterminate(DiscoveryActivity.this, _handler, "Scanning...", _discoveryWorkder, new OnDismissListener() {
			public void onDismiss(DialogInterface dialog)
			{

				for (; _bluetooth.isDiscovering();)
				{

					_bluetooth.cancelDiscovery();
				}

				_discoveryFinished = true;
			}
		}, true);
	}

	/* 显示列表 */
	protected void showDevices()
	{
		List<String> list = new ArrayList<String>();
		for (int i = 0, size = _devices.size(); i < size; ++i)
		{
			StringBuilder b = new StringBuilder();
			BluetoothDevice d = _devices.get(i);
			b.append(d.getAddress());
			b.append('\n');
			b.append(d.getName());
			String s = b.toString();
			list.add(s);
		}

		final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);
		_handler.post(new Runnable() {
			public void run()
			{

				setListAdapter(adapter);
			}
		});
	}
	protected void onListItemClick(ListView l, View v, int position, long id)
	{

		Intent result = new Intent();
		result.putExtra(BluetoothDevice.EXTRA_DEVICE, _devices.get(position));
		setResult(RESULT_OK, result);
		finish();
	}
}

 

 

 

分享到:
评论

相关推荐

    Android之蓝牙驱动开发总结.pdf

    理解 Android 蓝牙驱动开发是掌握 Android 蓝牙开发的关键。本文将从蓝牙基本概念、Android 蓝牙架构、蓝牙协议栈分析、HCI 层分析、蓝牙编程实现、蓝牙启动过程实现等六个方面对 Android 蓝牙驱动开发进行总结。 ...

    android studio 蓝牙开发demo

    总的来说,"android studio 蓝牙开发demo"涵盖了Android Bluetooth LE开发的基本流程,从设备搜索、连接、服务发现到数据交换,是学习和实践Android蓝牙编程的好素材。通过学习这个示例,开发者可以构建自己的蓝牙...

    Android 蓝牙开发,蓝牙连打印机

    总之,Android蓝牙开发需要理解蓝牙API、设备连接、数据传输和权限管理等概念,而蓝牙连打印机则涉及到特定的打印机协议和指令集。通过实践和研究如PrinterDemo这样的示例,开发者可以更好地掌握这个过程。

    android蓝牙开发步骤.pdf

    蓝牙设备服务是 Android 蓝牙开发的核心组件之一,它提供了蓝牙设备的初始化、连接、数据传输和断开等功能。 五、应用程序:HSP、HFP、SDP 应用程序是 Android 蓝牙开发的最高层组件之一。HSP、HFP、SDP 等应用...

    Android之蓝牙驱动开发总结

    "Android 蓝牙驱动开发总结" Android 蓝牙驱动开发是一种复杂的技术领域, 涉及到蓝牙协议栈、HCI 层、L2CAP 层、SDP 层等多个层面。本文将对 Android 蓝牙驱动开发进行总结,包括底层到上层的蓝牙驱动开发,及其在...

    android 蓝牙耳机开发

    在深入探讨“Android蓝牙耳机开发”这一主题时,我们首先需要理解的是,蓝牙技术在现代移动设备中的广泛应用,尤其是在音频传输领域,如蓝牙耳机的连接与控制。Android系统提供了丰富的API来支持蓝牙功能,使开发者...

    Android蓝牙开发(搜索,配对,连接,数据互传)

    以下是对"Android蓝牙开发(搜索,配对,连接,数据互传)"这个主题的详细解析。 首先,我们需要理解Android蓝牙的基础知识。Android系统支持蓝牙2.1以上的版本,包括经典蓝牙(Bluetooth Classic)和低功耗蓝牙...

    基于android的蓝牙开发

    首先,我们需要了解Android蓝牙开发的基础知识。Android系统从API Level 8(Android 2.2 Froyo)开始支持蓝牙API,包括低功耗蓝牙(Bluetooth Low Energy, BLE)从API Level 18(Android 4.3 Jelly Bean)开始引入。...

    Android蓝牙开发客户端代码

    首先,我们需要理解蓝牙技术的基本概念,然后我们将详细讨论Android蓝牙开发客户端的实现步骤。 蓝牙是一种短距离无线通信技术,允许电子设备之间进行数据交换。在Android中,蓝牙功能主要通过`BluetoothAdapter`、...

    Android 蓝牙开发,读取数据

    我们将基于描述中的"Android蓝牙开发,读取数据"这个主题进行讨论。 首先,我们需要理解Android蓝牙开发的基本概念。Android提供了一个名为BluetoothAdapter的类,它是处理蓝牙操作的核心接口。通过这个类,我们...

    Android蓝牙简单开发

    通过分析这些代码,开发者可以更好地理解和学习Android蓝牙开发的基本流程和最佳实践。 通过以上讲解,你应该对Android蓝牙开发有了初步了解。实际开发时,还要注意不同Android版本间的兼容性问题和蓝牙设备的差异...

    android 蓝牙开发 sample demo

    在Android平台上进行蓝牙开发是一项常见的任务,...总的来说,这个"android 蓝牙开发 sample demo"提供了全面的教程,让开发者能够快速上手Android蓝牙开发,理解蓝牙通信的基本流程,并为自己的项目打下坚实的基础。

    android 8.1 蓝牙开发 静默开启蓝牙 将蓝牙暴露给其他蓝牙设备 扫描蓝牙设备 静默配对 建联相互通信

    在Android 8.1系统中进行蓝牙开发,你需要掌握一系列的关键技术点,这些技术涵盖了蓝牙的静默开启、蓝牙设备的曝光、扫描蓝牙设备、静默配对以及建立连接进行相互通信。以下是对这些知识点的详细解释: 1. **静默...

    蓝牙通信 Android开发实现手机间通过蓝牙传输文件

    总的来说,这个Android应用通过集成蓝牙通信功能,实现了手机间的文件无线传输,展示了如何利用Android API与蓝牙设备交互。同时,也涵盖了权限请求、设备搜索、连接管理和数据通信等关键知识点。这样的应用在日常...

    基于Android的BlueTooth开发手机蓝牙和蓝牙模块通讯

    在Android平台上进行蓝牙开发,主要是利用Android提供的Bluetooth API来实现设备间的无线通信。这个过程涉及到多个关键步骤,包括蓝牙的开启、搜索、配对、连接以及数据传输等。以下是关于"基于Android的BlueTooth...

    Node.js-AndroidBLE蓝牙开发框架

    **Node.js-AndroidBLE蓝牙开发框架详解** 在移动设备开发中,蓝牙技术是实现设备间无线通信的关键技术之一。特别是低功耗蓝牙(Bluetooth Low Energy, BLE),在物联网(IoT)领域应用广泛,用于传感器数据传输、...

    安卓wifi蓝牙相关-android蓝牙hid协议开发实现手机连接蓝牙鼠标键盘扫描枪.rar

    本文将深入探讨Android蓝牙HID协议开发的相关知识点,并提供实现手机连接蓝牙外设的基础步骤。 首先,理解蓝牙HID协议至关重要。蓝牙HID是Bluetooth SIG(蓝牙特别兴趣小组)定义的一种标准,主要用于无线连接输入...

    Android无线蓝牙开发

    在Android蓝牙通信中,需要注意的是,由于安全性考虑,必须请求`BLUETOOTH_ADMIN`和`BLUETOOTH`权限。此外,从Android 6.0(API级别23)开始,运行时权限也应被处理。 `BluetoothDemo`可能是一个示例项目,它包含了...

Global site tag (gtag.js) - Google Analytics