上一篇博客介绍了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;
}