Android蓝牙配对

本文深入探讨了Android BLE 4.0的蓝牙配对过程,区别于传统版本的配对方式。作者研究了Android Settings的源码,解析了配对流程,包括请求配对通知、确认对话框、输入密码对话框等步骤,并提供了相关源码文件路径。此外,还提到了在Eclipse中开发时需注意的jar文件配置,以及关键的BluetoothPairingDialog.java类的功能分析。
摘要由CSDN通过智能技术生成

上一篇博客介绍了Android ble的一些情况。

http://blog.csdn.net/guijiaoba/article/details/41172403


蓝牙如果链接好,能够读写,基本上完成了。蓝牙还有个比较烦人的东西,就是蓝牙配对。

Android ble4.0使用的配对方式和原先版本的配对方式不一样。


看了网上很多地方都是hellogv大神的方法,这个真心不错。

http://blog.csdn.net/hellogv/article/details/6042091


本着认真的态度,我把Android系统中Settings的源码给研究了下,发现了配对的流程,Settings的源码大小大概有300m,考虑的攻击

Ble4.0的配对界面有2个部分,首先的是一个请求的配对的通知,点击了是一个确认对话框,再点击,然后又有个通知,点击通知后,有个输入密码的的对话框,输入密码后,点确定,稍后就会有配对的结果。


下面是Settings中的源码

Settings的目录是/package/app/Settings,下面是Setting的源码url,感兴趣的同学可以去研究下

http://git.omapzoom.org/   所有的源码网址

http://git.omapzoom.org/?p=platform/packages/apps/Settings.git;a=summary  Settings的网址

git://git.omapzoom.org/platform/packages/apps/Settings.git Settings的git地址

 

Settings中的蓝牙代码都在/Settings/src/com/android/settings/bluetooth目录中

主要流程看下面的文件

/Settings/src/com/android/settings/bluetooth/BluetoothPairingDialog.java

代码中很多的类,在实际的Android应该开发中是没有的,我这边准备了三个jar文件,分别是framework.jar,core.jar,ext.jar,这些事Android系统编译的时候,生产的jar。

导入到elcipse中,关联此jar就可以。关联的jar时放在libs中,但是有个必须注意的地方,点击项目的属性,在Java BuildPath类别,Order and Export标签,Android Dependenceis必须要比Android 5.0的在上面,这样在引用的时候,就会优先引用Android Dependceis中的jar。






下面是Setting中的BluetoothPairingDialog.java,简单分析下,中文部分是我添加的注释。

package com.android.settings.bluetooth;

import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.text.Editable;
import android.text.Html;
import android.text.InputFilter;
import android.text.InputType;
import android.text.Spanned;
import android.text.TextWatcher;
import android.text.InputFilter.LengthFilter;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.TextView;

import com.android.internal.app.AlertActivity;
import com.android.internal.app.AlertController;
import com.android.settings.R;
import android.view.KeyEvent;

import java.util.Locale;

/**
 * BluetoothPairingDialog asks the user to enter a PIN / Passkey / simple
 * confirmation for pairing with a remote Bluetooth device. It is an activity
 * that appears as a dialog.
 */

// BluetoothPairingDialog 说明这个节目是一个对话框
public final class BluetoothPairingDialog extends AlertActivity implements CompoundButton.OnCheckedChangeListener, DialogInterface.OnClickListener, TextWatcher {
	private static final String TAG = "BluetoothPairingDialog";

	private static final int BLUETOOTH_PIN_MAX_LENGTH = 16;
	private static final int BLUETOOTH_PASSKEY_MAX_LENGTH = 6;
	private BluetoothDevice mDevice;
	private int mType;
	private String mPairingKey;
	private EditText mPairingView;
	private Button mOkButton;

	/**
	 * Dismiss the dialog if the bond state changes to bonded or none, or if
	 * pairing was canceled for {@link #mDevice}.
	 */
	private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
		@Override
		public void onReceive(Context context, Intent intent) {
			String action = intent.getAction();
			if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) {

				// 当设备的配对状态改变的时候,就把对话框去掉
				int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR);
				if (bondState == BluetoothDevice.BOND_BONDED || bondState == BluetoothDevice.BOND_NONE) {
					dismiss();
				}
			} else if (BluetoothDevice.ACTION_PAIRING_CANCEL.equals(action)) {
				BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
				if (device == null || device.equals(mDevice)) {
					dismiss();
				}
			}
		}
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		// 必须是ACTION_PAIRING_REQUEST,否则不运行,ACTION_PAIRING_REQUEST是一个请求的配对的广播

		Intent intent = getIntent();
		if (!intent.getAction().equals(BluetoothDevice.ACTION_PAIRING_REQUEST是一个请求的配对的广播)) {
			Log.e(TAG, "Error: this activity may be started only with intent " + BluetoothDevice.ACTION_PAIRING_REQUEST);
			finish();
			return;
		}

		
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值