首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

各位兄弟姐妹帮忙看看 蓝牙连接错误Service discovery failed

2013-04-20 
各位兄弟姐妹帮忙看看 蓝牙连接异常Service discovery failedpackage com.testimport java.io.IOExceptio

各位兄弟姐妹帮忙看看 蓝牙连接异常Service discovery failed


package com.test;

import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.Set;
import java.util.UUID;

import android.app.Activity;
import android.app.ProgressDialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;

public class Other extends Activity {

public static final UUID MyUUID = UUID
.fromString("00001101-0000-1000-8000-00805F9B34FB");
private BluetoothSocket btSocket = null;
private BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();// 获取蓝牙设备
private Set<BluetoothDevice> devices = null;
private BluetoothDevice device;
private BluetoothDevice btDev;
private ProgressDialog bluetoothPro;
private boolean bluetoothstause = true;
private Intent recalled;
private connectbluetooth connectdevice = null;
private volatile boolean _discoveryFinished;
private discover myDiscovery = new discover();

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.other);
// 获取当前已经配对的设备
devices = adapter.getBondedDevices();
// 创建一个进度条
bluetoothPro = new ProgressDialog(this);
// 如果已配对的设备大于0 就查找到目标设备并且开始连接 如果没有找到到设备就开始搜索
if (devices.size() > 0) {
int cnt = 0;
for (Iterator<BluetoothDevice> it = devices.iterator(); it
.hasNext();) {
device = (BluetoothDevice) it.next();
if (device.getName().equals("PC-60NW")) {
cnt++;
bluetoothConnect(device);
break;
}
}
if (cnt == 0) {
// 没有以配对设备 开始搜索
System.out.println("配对设备中没有找到目标设备 开始搜索");
Discovery();
}
} else {
// 没有以配对设备 开始搜索
System.out.println("没有以配对设备 开始搜索");
Discovery();
}
}

// 搜索设备开始的函数
public void Discovery() {
/* 注册接收器 */
IntentFilter discoveryFilter = new IntentFilter(
BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
registerReceiver(_discoveryReceiver, discoveryFilter);

IntentFilter foundFilter = new IntentFilter(
BluetoothDevice.ACTION_FOUND);
registerReceiver(_foundReceiver, foundFilter);

// 再次去确定蓝牙设备状态
if (!adapter.isEnabled()) {
adapter.enable();
}
// 设置进度条显示的提示信息
bluetoothPro.setMessage("Discovery...");
bluetoothPro.show();
// 启动线程开始搜索设备
myDiscovery.start();
}

// 在线程中搜索设备
public class discover extends Thread {

@Override
public void run() {
// TODO Auto-generated method stub
super.run();

adapter.startDiscovery();
for (;;) {


if (_discoveryFinished) {
break;
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
}
}
}

public class connectbluetooth extends Thread {

BluetoothDevice mDevice;

public connectbluetooth(BluetoothDevice newdevice){
mDevice = newdevice;
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
// 更加设备地址 返回一个远程蓝牙设备
System.out.println("mDevice="+mDevice.getAddress());
btDev = adapter.getRemoteDevice(mDevice.getAddress());
System.out.println("btDev=="+btDev);
try {
if (btDev.getBondState() == BluetoothDevice.BOND_NONE) {
Method createBondMethod = BluetoothDevice.class.getMethod("createBond");
System.out.println("开始配对");
createBondMethod.invoke(btDev);
}
System.out.println("准备连接");
//mHandler.sendEmptyMessage(0x01);
btSocket = btDev.createRfcommSocketToServiceRecord(MyUUID);
btSocket.connect();
bluetoothPro.dismiss();
System.out.println("连接成功返回");
} catch (Exception e) {
e.printStackTrace();
System.out.println("连接异常" + e.getMessage());
Finish(true);
}
}
}

Handler mHandler = new Handler() {

@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
switch (msg.what) {
case 0x01: {
bluetoothConnect(btDev);
}
break;
default:
break;
}
}

};

// 设备连接函数 完成和目标设备的连接功能
public void bluetoothConnect(BluetoothDevice btDev) {
if (bluetoothPro.isShowing()) {
bluetoothPro.dismiss();
}
System.out.println("开始连接");
bluetoothPro.setMessage("Connecting...");
bluetoothPro.show();
try {
System.out.println("蓝牙连接 "+btDev.getAddress()+"  "+device.getAddress());
btSocket = btDev.createRfcommSocketToServiceRecord(MyUUID);
btSocket.connect();
bluetoothPro.dismiss();
System.out.println("连接成功返回");
Finish(false);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("连接失败 " + e.getMessage());
bluetoothPro.dismiss();
Finish(true);
}
}

// 搜索设备的广播监听器 如果搜索到设备 将回调该方法
private BroadcastReceiver _foundReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
/* 从intent中取得搜索结果数据 */
device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

// 发现设备时 先改变进度条样式 在启动连接设备线程 同时取消蓝牙设备的搜索功能
if (device.getName().equals("PC-60NW")) {
connectdevice = new connectbluetooth(device);
connectdevice.start();
adapter.cancelDiscovery();
System.out.println("接收到设备--------->" + device.getName());
}
}
};
private BroadcastReceiver _discoveryReceiver = new BroadcastReceiver() {

@Override
public void onReceive(Context context, Intent intent) {
/* 卸载注册的接收器 */


unregisterReceiver(_foundReceiver);
unregisterReceiver(this);
_discoveryFinished = true;
}
};

public void Finish(boolean stause) {
if (bluetoothPro.isShowing()) {
bluetoothPro.dismiss();
}
bluetoothstause = stause;
recalled = this.getIntent();
recalled.putExtra("nofind", bluetoothstause);
this.setResult(R.layout.activity_main, recalled);
System.out.println("Finish");
finish();
}
}



如果是已经配对的设备连接就能成功  如果没有配对 重新搜索后再连接就报Service discovery failed异常
各位大神们帮忙看看  小弟先谢过了
[解决办法]
1.android的bluetooth有bug,我也碰到过这样的问题,莫名的抛异常。
2.没有配对的情况下应该先配对再连接把?否则确实会有异常

热点排行