Android蓝牙开发入门

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/freelander_j/article/details/52171814

        在Android开发中不免会涉及到蓝牙的使用,尤其是在物联网发展迅速的现在,好多设备都是通过蓝牙来连接的,今天我们就简单的了解一下Android开发蓝牙,这里只是对蓝牙简单的做一个入门的解释,后面会继续对蓝牙的各个功能深入去讲解。

        首先,在Android手机上开发蓝牙操作,需要用到android.bluetooth包,其中BluetoothAdapter是蓝牙开发中的核心类,代表本地蓝牙适配器设备,用户能够通过BluetoothAdapter进行一些基本的蓝牙操作,例如:判断本机的蓝牙是否开启、打开和关闭蓝牙、搜索附近设备等,接下来我们就通过代码来具体的了解下蓝牙的操作。


       开启蓝牙也是属于敏感操作,所以需要在AndroidManifest.xml文件中声明操作权限,否则会报错,这点千万不要疏忽

<uses-permission android:name="android.permission.BLUETOOTH"/>    //允许配对设备
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>    //允许发现设备

        判断本机是否支持蓝牙,新建BluetoothAdapter对象来判断

BluetoothAdapter mBluetoothAdapter = android.bluetooth.BluetoothAdapter.getDefaultAdapter();
if(mBluetoothAdapter == null) {
	Toast.makeText(this, "该设备不支持蓝牙!", Toast.LENGTH_LONG).show();
}
        这里需要有一点注意的是,该方式适用于在API<=17时使用,当在API>=18时,使用getSystemService(Context.BLUETOOTH_SERVICE),获取BluetoothManager,然后通过BluetoothManager.getAdapter()的方式,获取BluetoothAdapter,因此我们可以在程序中这样去判断:
public static BluetoothAdapter getDefaultAdapter(Context context) {
  BluetoothAdapter mBluetoothAdapter = null;
  if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.JELLY_BEAN_MR1) {
      mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
  } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
      final BluetoothManager bluetoothManager = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);
      mBluetoothAdapter = bluetoothManager.getAdapter();
  }
  return mBluetoothAdapter;
}
if(mBluetoothAdapter == null) {
	Toast.makeText(this, "该设备不支持蓝牙!", Toast.LENGTH_LONG).show();
}

        打开蓝牙的方式有好多种,1、可以在系统的设置->蓝牙中去开启蓝牙;2、也可以在自己的程序中去直接开启蓝牙,首先调用BluetoothAdapter的isEnabled()方法判断蓝牙是否已经开启,然后根据返回值去调用enable()打开蓝牙或者disable()去关闭蓝牙;3、通过Intent隐式意图是开启,开启时访问用户是否去要开启(毕竟蓝牙属于敏感操作,在开启时是否需要去询问用户,根据实际情况去使用)

BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
//判断蓝牙功能是否打开
if (!mBluetoothAdapter.isEnabled()) {
    //没有打开,就启动确认窗口询问用户是否打开
    Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    startActivity(intent);
}

        获取本机蓝牙的信息,我们可以通过BluetoothAdapter对象去调用getName()方法获取本机蓝牙的名称,getState()方法去获取本机蓝牙的状态,状态有四种,用常量值表示:

                10  STATE_OFF                         // 蓝牙已经关闭

                11  STATE_TURNING_OFF     // 蓝牙正在关闭

                12  STATE_ON                           // 蓝牙已经打开

                13  STATE_TURNING_ON      // 蓝牙正在打开

        接下来就是搜索附近蓝牙设备了,由于搜索到的蓝牙设备都是通过广播返回的,所以我们需要使用广播来接收已经搜索到的蓝牙设备信息,当开始搜索是,系统会发出一个BluetoothAdapter.ACTION_DISCOVERY_STARTED的广播,当搜索结束后,系统会发出一个BluetoothAdapter.ACTION_DISCOVERY_FINISHED的广播,当搜索到某个可以连接的设备时,系统会发出一个BluetoothAdapter.ACTION_FOUND的广播,并将该设备信息保存至广播对应的Intent中,代码如下:

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 device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
			if(device.getBondState() != BluetoothDevice.BOND_BONDED) {
				mTextView.append(device.getName() + ":" + device.getAddress() + "\n\n");//将搜索到的可连接设备名称和地址放到一个TextView中
			}
		} else if(action.equals(android.bluetooth.BluetoothAdapter.ACTION_DISCOVERY_FINISHED)) {
			//搜索结束
		}
	}
};
        在以上代码中,我们用BluetoothDevice类对象去接收Intent传递的蓝牙设备信息,其中保存有该设备的相关信息;


         在onCreat()方法中注册广播,并且在程序结束后在onDestroy()方法中取消注册

IntentFilter mFilter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mReceiver, mFilter);
		
mFilter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
registerReceiver(mReceiver, mFilter);
@Override
protected void onDestroy() {
	// TODO Auto-generated method stub
	super.onDestroy();
	unregisterReceiver(mReceiver);
}


        通过以上操作,我们就可以进行简单的开启蓝牙并搜索附近的蓝牙设备了,这里只是贴出了相关功能的代码,并没有涉及到对应的界面操作代码,大家有兴趣的可以自己去美化界面,通过一个开关按钮去开启/关闭蓝牙,将搜索到的设备信息以ListView的形式展现出来等。


        以上如有不合理或者错误之处,还望大家留言指出,谢谢!


没有更多推荐了,返回首页