我看了几个文章,主要是接受配对广播,然后设置pin,实现配对,但是网上的大部分手机是不可以的,android.bluetoothdevice 下 action_pair_request ,没有定义这个,开始困扰了我一点时间,实现难度:是否能进入那个广播响应。

定义了一个类,这个是网上的可以直接用

//================================================================================================================================

packagezicox.esc;

importjava.lang.reflect.Method;

importjava.lang.reflect.Field;

importandroid.bluetooth.BluetoothAdapter;

importandroid.bluetooth.BluetoothDevice;

importandroid.util.Log;

publicclassClsUtils

{

/**

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

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

*/

staticpublicbooleancreateBond(Class btClass, BluetoothDevice btDevice)

throwsException

{

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

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

returnreturnValue.booleanValue();

}

/**

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

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

*/

staticpublicbooleanremoveBond(Class btClass, BluetoothDevice btDevice)

throwsException

{

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

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

returnreturnValue.booleanValue();

}

staticpublicbooleansetPin(Class btClass, BluetoothDevice btDevice,

String str) throwsException

{

try

{

Method removeBondMethod = btClass.getDeclaredMethod("setPin",

newClass[]

{byte[].class});

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

newObject[]

{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();

}

returntrue;

}

// 取消用户输入

staticpublicbooleancancelPairingUserInput(Class btClass,

BluetoothDevice device)

throwsException

{

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

// cancelBondProcess()

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

returnreturnValue.booleanValue();

}

// 取消配对

staticpublicbooleancancelBondProcess(Class btClass,

BluetoothDevice device)

throwsException

{

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

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

returnreturnValue.booleanValue();

}

/**

*

* @param clsShow

*/

staticpublicvoidprintAllInform(Class clsShow)

{

try

{

// 取得所有方法

Method[] hideMethod = clsShow.getMethods();

inti =0;

for(; i 

{

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

+ i);

}

// 取得所有常量

Field[] allFields = clsShow.getFields();

for(i =0; 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();

}

}

staticpublicbooleanpair(String strAddr, String strPsw)

{

booleanresult =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);

//                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.createBond(device.getClass(), device);

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

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

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

result = true;

}

catch(Exception e)

{

// TODO Auto-generated catch block

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

e.printStackTrace();

}

}

returnresult;

}

}

//================================================================================================================================

还有一部分 activity

//================================================================================================================================

packagezicox.esc;

importjava.io.IOException;

importjava.io.UnsupportedEncodingException;

importjava.lang.reflect.Method;

importjava.util.ArrayList;

importjava.util.List;

importjava.util.UUID;

importandroid.app.Activity;

importandroid.bluetooth.BluetoothAdapter;

importandroid.bluetooth.BluetoothDevice;

importandroid.bluetooth.BluetoothSocket;

importandroid.content.BroadcastReceiver;

importandroid.content.Context;

importandroid.content.Intent;

importandroid.content.IntentFilter;

importandroid.os.Bundle;

importandroid.util.Log;

importandroid.view.View;

importandroid.widget.AdapterView;

importandroid.widget.ArrayAdapter;

importandroid.widget.Button;

importandroid.widget.ListView;

importandroid.widget.Toast;

importandroid.widget.ToggleButton;

publicclassDemo_ad_escActivityextendsActivity

{

//---------------------------------------------------

publicstaticString ErrorMessage;

Button btnSearch, btnDis, btnExit;

ToggleButton tbtnSwitch;

ListView lvBTDevices;

ArrayAdapter adtDevices;

List lstDevices = newArrayList();

BluetoothAdapter btAdapt;

publicstaticBluetoothSocket btSocket;

//---------------------------------------------------

publicvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

//  if(!ListBluetoothDevice())finish();

Button Button1 = (Button) findViewById(R.id.button1);

ErrorMessage = "";

//---------------------------------------------------

btnSearch = (Button) this.findViewById(R.id.btnSearch);

btnSearch.setOnClickListener(newClickEvent());

btnExit = (Button) this.findViewById(R.id.btnExit);

btnExit.setOnClickListener(newClickEvent());

btnDis = (Button) this.findViewById(R.id.btnDis);

btnDis.setOnClickListener(newClickEvent());

// ToogleButton设置

tbtnSwitch = (ToggleButton) this.findViewById(R.id.toggleButton1);

tbtnSwitch.setOnClickListener(newClickEvent());

// ListView及其数据源 适配器

lvBTDevices = (ListView) this.findViewById(R.id.listView1);

adtDevices = newArrayAdapter(this,

android.R.layout.simple_list_item_1, lstDevices);

lvBTDevices.setAdapter(adtDevices);

lvBTDevices.setOnItemClickListener(newItemClickEvent());

btAdapt = BluetoothAdapter.getDefaultAdapter();// 初始化本机蓝牙功能

if(btAdapt.isEnabled())

tbtnSwitch.setChecked(false);

else

tbtnSwitch.setChecked(true);

// 注册Receiver来获取蓝牙设备相关的结果

String ACTION_PAIRING_REQUEST = "android.bluetooth.device.action.PAIRING_REQUEST";

IntentFilter intent = newIntentFilter();

intent.addAction(BluetoothDevice.ACTION_FOUND);// 用BroadcastReceiver来取得搜索结果

intent.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);

intent.addAction(ACTION_PAIRING_REQUEST);

intent.addAction(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);

intent.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);

registerReceiver(searchDevices, intent);

Button1.setOnClickListener(newButton.OnClickListener()

{

publicvoidonClick(View arg0)

{

//          Print1(SelectedBDAddress);

}

});

}

//---------------------------------------------------

privateBroadcastReceiver searchDevices =newBroadcastReceiver() {

publicvoidonReceive(Context context, Intent intent) {

String action = intent.getAction();

Bundle b = intent.getExtras();

Object[] lstName = b.keySet().toArray();

// 显示所有收到的消息及其细节

for(inti =0; i 

String keyName = lstName[i].toString();

Log.e(keyName, String.valueOf(b.get(keyName)));

}

BluetoothDevice device = null;

// 搜索设备时,取得设备的MAC地址

if(BluetoothDevice.ACTION_FOUND.equals(action)) {

device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

if(device.getBondState() == BluetoothDevice.BOND_NONE) {

String str = "未配对|"+ device.getName() +"|"

+ device.getAddress();

if(lstDevices.indexOf(str) == -1)// 防止重复添加

lstDevices.add(str); // 获取设备名称和mac地址

adtDevices.notifyDataSetChanged();

try{

ClsUtils.setPin(device.getClass(),device,"0000");

} catch(Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

try{

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

} catch(Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}elseif(BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)){

device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

switch(device.getBondState()) {

caseBluetoothDevice.BOND_BONDING:

Log.d("BlueToothTestActivity","正在配对......");

break;

caseBluetoothDevice.BOND_BONDED:

Log.d("BlueToothTestActivity","完成配对");

connect(device);//连接设备

break;

caseBluetoothDevice.BOND_NONE:

Log.d("BlueToothTestActivity","取消配对");

default:

break;

}

}

if(intent.getAction().equals("android.bluetooth.device.action.PAIRING_REQUEST"))

{

Log.e("tag11111111111111111111111","ddd");

BluetoothDevice btDevice = intent

.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

// byte[] pinBytes = BluetoothDevice.convertPinToBytes("1234");

// device.setPin(pinBytes);

try

{

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

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

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

}

catch(Exception e)

{

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

};

classItemClickEventimplementsAdapterView.OnItemClickListener {

@Override

publicvoidonItemClick(AdapterView> arg0, View arg1,intarg2,

longarg3) {

if(btAdapt.isDiscovering())btAdapt.cancelDiscovery();

String str = lstDevices.get(arg2);

String[] values = str.split("\\|");

String address = values[2];

Log.e("address", values[2]);

BluetoothDevice btDev = btAdapt.getRemoteDevice(address);

try{

Boolean returnValue = false;

if(btDev.getBondState() == BluetoothDevice.BOND_NONE) {

//利用反射方法调用BluetoothDevice.createBond(BluetoothDevice remoteDevice);

//                    Method createBondMethod = BluetoothDevice.class.getMethod("createBond");

//                    Log.d("BlueToothTestActivity", "开始配对");

//                    returnValue = (Boolean) createBondMethod.invoke(btDev);

ClsUtils.pair(address, "0000");

showMessage("here");

}elseif(btDev.getBondState() == BluetoothDevice.BOND_BONDED){

connect(btDev);

}

} catch(Exception e) {

e.printStackTrace();

}

}

}

privatevoidconnect(BluetoothDevice btDev) {

finalUUID SPP_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

UUID uuid = SPP_UUID;

try{

btSocket = btDev.createRfcommSocketToServiceRecord(uuid);

Log.d("BlueToothTestActivity","开始连接...");

btSocket.connect();

} catch(IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

classClickEventimplementsView.OnClickListener {

@Override

publicvoidonClick(View v) {

if(v == btnSearch)// 搜索蓝牙设备,在BroadcastReceiver显示结果

{

if(btAdapt.getState() == BluetoothAdapter.STATE_OFF) {// 如果蓝牙还没开启

Toast.makeText(Demo_ad_escActivity.this,"请先打开蓝牙",1000).show();return;

}

if(btAdapt.isDiscovering())

btAdapt.cancelDiscovery();

lstDevices.clear();

Object[] lstDevice = btAdapt.getBondedDevices().toArray();

for(inti =0; i 

BluetoothDevice device = (BluetoothDevice) lstDevice[i];

String str = "已配对|"+ device.getName() +"|"

+ device.getAddress();

lstDevices.add(str); // 获取设备名称和mac地址

adtDevices.notifyDataSetChanged();

}

setTitle("本机蓝牙地址:"+ btAdapt.getAddress());

btAdapt.startDiscovery();

} elseif(v == tbtnSwitch) {// 本机蓝牙启动/关闭

if(tbtnSwitch.isChecked() ==false)

btAdapt.enable();

elseif(tbtnSwitch.isChecked() ==true)

btAdapt.disable();

} elseif(v == btnDis)// 本机可以被搜索

{

Intent discoverableIntent = newIntent(

BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);

discoverableIntent.putExtra(

BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);

startActivity(discoverableIntent);

} elseif(v == btnExit) {

try{

if(btSocket !=null)

btSocket.close();

} catch(IOException e) {

e.printStackTrace();

}

Demo_ad_escActivity.this.finish();

}

}

}

@Override

protectedvoidonDestroy() {

this.unregisterReceiver(searchDevices);

super.onDestroy();

android.os.Process.killProcess(android.os.Process.myPid());

}

publicvoidshowMessage(String str)

{

Toast.makeText(this,str, Toast.LENGTH_LONG).show();

}

}

//===================================================================================================

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐