您的位置:首页 > 移动开发 > Android开发

android 实现蓝牙自动配对连接

2012-09-18 18:18 507 查看
BluetoothConnectActivityReceiver.java:监听蓝牙配对的广播

代码:

package com.imte.Broadcast;

import com.imte.utils.ClsUtils;

import com.itme.ActivityClass.R;

import android.bluetooth.BluetoothDevice;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.os.Handler;

import android.util.Log;

import android.widget.Toast;

public class BluetoothConnectActivityReceiver extends BroadcastReceiver {

String strPsw = "123456";

@Override

public void onReceive(Context context, Intent intent) {

// TODO Auto-generated method stub

if (intent.getAction().equals(

"android.bluetooth.device.action.PAIRING_REQUEST")) {

BluetoothDevice btDevice = intent

.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

try {

ClsUtils.setPin(btDevice.getClass(), btDevice, strPsw); // 手机和蓝牙采集器配对

ClsUtils.createBond(btDevice.getClass(), btDevice);

ClsUtils.cancelPairingUserInput(btDevice.getClass(), btDevice);

Toast.makeText(

context,

context.getResources().getString(

R.string.bluetooth_connect_success),

Toast.LENGTH_SHORT);

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

// Thread thread=new Thread(strPsw);

// thread.

}

}

}

}

ClsUtils.java:里面主要是一些通过反射机制得到蓝牙配对的相关方法,代码如下:

package com.imte.utils;

/************************************ 蓝牙配对函数 * **************/

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import android.bluetooth.BluetoothDevice;

import android.util.Log;

public class ClsUtils

{

/**

* 与设备配对 参考源码:platform/packages/apps/Settings.git

* /Settings/src/com/android/settings/bluetooth/CachedBluetoothDevice.java

*/

static public boolean createBond(Class btClass, BluetoothDevice btDevice)

throws Exception

{

Method createBondMethod = btClass.getMethod("createBond");

Boolean returnValue = (Boolean) createBondMethod.invoke(btDevice);

return returnValue.booleanValue();

}

/**

* 与设备解除配对 参考源码:platform/packages/apps/Settings.git

* /Settings/src/com/android/settings/bluetooth/CachedBluetoothDevice.java

*/

static public boolean removeBond(Class btClass, BluetoothDevice btDevice)

throws Exception

{

Method removeBondMethod = btClass.getMethod("removeBond");

Boolean returnValue = (Boolean) removeBondMethod.invoke(btDevice);

return returnValue.booleanValue();

}

static public boolean setPin(Class btClass, BluetoothDevice btDevice,

String str) throws Exception

{

try

{

Method removeBondMethod = btClass.getDeclaredMethod("setPin",

new Class[]

{byte[].class});

Boolean returnValue = (Boolean) removeBondMethod.invoke(btDevice,

new Object[]

{str.getBytes()});

Log.e("returnValue", "" + returnValue);

}

catch (SecurityException e)

{

// throw new RuntimeException(e.getMessage());

e.printStackTrace();

}

catch (IllegalArgumentException e)

{

// throw new RuntimeException(e.getMessage());

e.printStackTrace();

}

catch (Exception e)

{

// TODO Auto-generated catch block

e.printStackTrace();

}

return true;

}

// 取消用户输入

static public boolean cancelPairingUserInput(Class btClass,

BluetoothDevice device)

throws Exception

{

Method createBondMethod = btClass.getMethod("cancelPairingUserInput");

// cancelBondProcess()

Boolean returnValue = (Boolean) createBondMethod.invoke(device);

return returnValue.booleanValue();

}

// 取消配对

static public boolean cancelBondProcess(Class btClass,

BluetoothDevice device)

throws Exception

{

Method createBondMethod = btClass.getMethod("cancelBondProcess");

Boolean returnValue = (Boolean) createBondMethod.invoke(device);

return returnValue.booleanValue();

}

/**

*

* @param clsShow

*/

static public void printAllInform(Class clsShow)

{

try

{

// 取得所有方法

Method[] hideMethod = clsShow.getMethods();

int i = 0;

for (; i < hideMethod.length; i++)

{

Log.e("method name", hideMethod[i].getName() + ";and the i is:"

+ i);

}

// 取得所有常量

Field[] allFields = clsShow.getFields();

for (i = 0; i < allFields.length; i++)

{

Log.e("Field name", allFields[i].getName());

}

}

catch (SecurityException e)

{

// throw new RuntimeException(e.getMessage());

e.printStackTrace();

}

catch (IllegalArgumentException e)

{

// throw new RuntimeException(e.getMessage());

e.printStackTrace();

}

catch (Exception e)

{

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

最后就是MainActivity,用一个按钮来实现自动配对,代码如下:

package com.itme.ActivityClass;

import android.app.Activity;

import android.bluetooth.BluetoothAdapter;

import android.bluetooth.BluetoothDevice;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import com.imte.utils.ClsUtils;

public class MainActivity extends Activity implements OnClickListener{

/** Called when the activity is first created. */

private static BluetoothDevice remoteDevice=null;

private Button btn_autopair=null;

final static String ACTION_BLUETOOTHBC="android.bluetooth.device.action.PAIRING_REQUEST";

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

btn_autopair=(Button)findViewById(R.id.btn_autopair);

btn_autopair.setOnClickListener(this);

}

public static boolean pair(String strAddr, String strPsw)

{

boolean result = false;

//蓝牙设备适配器

BluetoothAdapter bluetoothAdapter = BluetoothAdapter

.getDefaultAdapter();

//取消发现当前设备的过程

bluetoothAdapter.cancelDiscovery();

if (!bluetoothAdapter.isEnabled())

{

bluetoothAdapter.enable();

}

if (!BluetoothAdapter.checkBluetoothAddress(strAddr))

{ // 检查蓝牙地址是否有效

Log.d("mylog", "devAdd un effient!");

}

//由蓝牙设备地址获得另一蓝牙设备对象

BluetoothDevice device = bluetoothAdapter.getRemoteDevice(strAddr);

if (device.getBondState() != BluetoothDevice.BOND_BONDED)

{

try

{

Log.d("mylog", "NOT BOND_BONDED");

ClsUtils.setPin(device.getClass(), device, strPsw); // 手机和蓝牙采集器配对

ClsUtils.createBond(device.getClass(), device);

// ClsUtils.cancelPairingUserInput(device.getClass(), device);

remoteDevice = device; // 配对完毕就把这个设备对象传给全局的remoteDevice

result = true;

}

catch (Exception e)

{

// TODO Auto-generated catch block

Log.d("mylog", "setPiN failed!");

e.printStackTrace();

} //

}

else

{

Log.d("mylog", "HAS BOND_BONDED");

try

{

//ClsUtils这个类的的以下静态方法都是通过反射机制得到需要的方法

ClsUtils.createBond(device.getClass(), device);//创建绑定

ClsUtils.setPin(device.getClass(), device, strPsw); // 手机和蓝牙采集器配对

ClsUtils.createBond(device.getClass(), device);

// ClsUtils.cancelPairingUserInput(device.getClass(), device);

remoteDevice = device; // 如果绑定成功,就直接把这个设备对象传给全局的remoteDevice

result = true;

}

catch (Exception e)

{

// TODO Auto-generated catch block

Log.d("mylog", "setPiN failed!");

e.printStackTrace();

}

}

return result;

}

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

switch (v.getId()) {

case R.id.btn_autopair:

if (pair("94:DB:46:2B:A1:82", "123456")) {//pair的第一个参数是要配对的蓝牙地址,第二个参数是配对时预先设置的密钥

Log.i("aaron", remoteDevice.getAddress());

}

break;

default:

break;

}

}

}

叮咚..如题的功能就实现了。。。

项目源代码下载地址: http://download.csdn.net/detail/huangrangg12/4578242
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: