这段 安卓软件中的代码中如何判断 手机是不是连接到 蓝牙设备
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了这段 安卓软件中的代码中如何判断 手机是不是连接到 蓝牙设备相关的知识,希望对你有一定的参考价值。
public class BluetoothConnection
static BluetoothSocket btSock = null;
public static void closeConnection()
if (btSock == null)
return;
try
btSock.getInputStream().close();
btSock.getOutputStream().close();
btSock.close();
btSock = null;
return;
catch (IOException localIOException)
public static int doTelescopeCommand(byte[] paramArrayOfByte1, int paramInt1, byte[] paramArrayOfByte2, int paramInt2, byte paramByte, int paramInt3)
int i = Telescope.TEL_SERIAL_READ_ERROR;
byte[] arrayOfByte = new byte[256];
try
OutputStream localOutputStream = btSock.getOutputStream();
InputStream localInputStream = btSock.getInputStream();
while (true)
i = Telescope.TEL_SERIAL_WRITE_ERROR;
if ((paramInt1 > 0) && (paramArrayOfByte1 != null))
localOutputStream.write(paramArrayOfByte1);
localOutputStream.flush();
if (paramInt2 < 1)
return Telescope.TEL_NO_ERROR;
do
int k = localInputStream.available();
if (k >= 1);
localInputStream.read(arrayOfByte, 0, Math.min(k, 256));
continue;
long l = System.currentTimeMillis() + paramInt3;
i = Telescope.TEL_SERIAL_READ_ERROR;
int j = 0;
if (System.currentTimeMillis() >= l)
i = Telescope.TEL_TIMEOUT_ERROR;
while (true)。。。。。 还有不少代码,自己只能看懂个大概
try
// 连接
connect(device);
catch (IOException e)
Toast.makeText(MainActivity.this, "没有成功连接设备", //1
Toast.LENGTH_SHORT).show();
若成功了,不会运行1,不成功,就会产生异常。运行异常中的程序,也就是代码1. 参考技术B android对于蓝牙开发从2.0版本的sdk才开始支持,而且模拟器不支持,测试至少需要两部手机,所以制约了很多技术人员的开发。
1. 首先,要操作蓝牙,先要在AndroidManifest.xml里加入权限
// 管理蓝牙设备的权限
<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN" />
// 使用蓝牙设备的权限
<uses-permissionandroid:name="android.permission.BLUETOOTH" />
2.打开蓝牙
获得蓝牙适配器(android.bluetooth.BluetoothAdapter),检查该设备是否支持蓝牙,如果支持,就打开蓝牙。
[java]
// 检查设备是否支持蓝牙
adapter = BluetoothAdapter.getDefaultAdapter();
if (adapter == null)
// 设备不支持蓝牙
// 打开蓝牙
if (!adapter.isEnabled())
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
// 设置蓝牙可见性,最多300秒
intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
context.startActivity(intent);
// 检查设备是否支持蓝牙
adapter = BluetoothAdapter.getDefaultAdapter();
if (adapter == null)
// 设备不支持蓝牙
// 打开蓝牙
if (!adapter.isEnabled())
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
// 设置蓝牙可见性,最多300秒
intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
context.startActivity(intent);
3.获取已配对的蓝牙设备(android.bluetooth.BluetoothDevice)
首次连接某蓝牙设备需要先配对,一旦配对成功,该设备的信息会被保存,以后连接时无需再配对,所以已配对的设备不一定是能连接的。
[java]
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
Set<BluetoothDevice> devices = adapter.getBondedDevices();
for(int i=0; i<devices.size(); i++)
BluetoothDevice device = (BluetoothDevice) devices.iterator().next();
System.out.println(device.getName());
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
Set<BluetoothDevice> devices = adapter.getBondedDevices();
for(int i=0; i<devices.size(); i++)
BluetoothDevice device = (BluetoothDevice) devices.iterator().next();
System.out.println(device.getName());
4.搜索周围的蓝牙设备
适配器搜索蓝牙设备后将结果以广播形式传出去,所以需要自定义一个继承广播的类,在onReceive方法中获得并处理蓝牙设备的搜索结果。
[java]
// 设置广播信息过滤
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(BluetoothDevice.ACTION_FOUND);
intentFilter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
intentFilter.addAction(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);
intentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
// 注册广播接收器,接收并处理搜索结果
context.registerReceiver(receiver, intentFilter);
// 寻找蓝牙设备,android会将查找到的设备以广播形式发出去
adapter.startDiscovery();
// 设置广播信息过滤
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(BluetoothDevice.ACTION_FOUND);
intentFilter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
intentFilter.addAction(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);
intentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
// 注册广播接收器,接收并处理搜索结果
context.registerReceiver(receiver, intentFilter);
// 寻找蓝牙设备,android会将查找到的设备以广播形式发出去
adapter.startDiscovery(); 自定义广播类
[java]
private BroadcastReceiver receiver = new BroadcastReceiver()
@Override
public void onReceive(Context context, Intent intent)
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action))
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
System.out.println(device.getName());
private BroadcastReceiver receiver = new BroadcastReceiver()
@Override
public void onReceive(Context context, Intent intent)
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action))
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
System.out.println(device.getName());
5.蓝牙设备的配对和状态监视
[java]
private BroadcastReceiver receiver = new BroadcastReceiver()
@Override
public void onReceive(Context context, Intent intent)
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action))
// 获取查找到的蓝牙设备
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
System.out.println(device.getName());
// 如果查找到的设备符合要连接的设备,处理
if (device.getName().equalsIgnoreCase(name))
// 搜索蓝牙设备的过程占用资源比较多,一旦找到需要连接的设备后需要及时关闭搜索
adapter.cancelDiscovery();
// 获取蓝牙设备的连接状态
connectState = device.getBondState();
switch (connectState)
// 未配对
case BluetoothDevice.BOND_NONE:
// 配对
try
Method createBondMethod = BluetoothDevice.class.getMethod("createBond");
createBondMethod.invoke(device);
catch (Exception e)
e.printStackTrace();
break;
// 已配对
case BluetoothDevice.BOND_BONDED:
try
// 连接
connect(device);
catch (IOException e)
e.printStackTrace();
break;
else if(BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action))
// 状态改变的广播
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (device.getName().equalsIgnoreCase(name))
connectState = device.getBondState();
switch (connectState)
case BluetoothDevice.BOND_NONE:
break;
case BluetoothDevice.BOND_BONDING:
break;
case BluetoothDevice.BOND_BONDED:
try
// 连接
connect(device);
catch (IOException e)
e.printStackTrace();
break;
private BroadcastReceiver receiver = new BroadcastReceiver()
@Override
public void onReceive(Context context, Intent intent)
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action))
// 获取查找到的蓝牙设备
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
System.out.println(device.getName());
// 如果查找到的设备符合要连接的设备,处理
if (device.getName().equalsIgnoreCase(name))
// 搜索蓝牙设备的过程占用资源比较多,一旦找到需要连接的设备后需要及时关闭搜索
adapter.cancelDiscovery();
// 获取蓝牙设备的连接状态
connectState = device.getBondState();
switch (connectState)
// 未配对
case BluetoothDevice.BOND_NONE:
// 配对
try
Method createBondMethod = BluetoothDevice.class.getMethod("createBond");
createBondMethod.invoke(device);
catch (Exception e)
e.printStackTrace();
break;
// 已配对
case BluetoothDevice.BOND_BONDED:
try
// 连接
connect(device);
catch (IOException e)
e.printStackTrace();
break;
else if(BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action))
// 状态改变的广播
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (device.getName().equalsIgnoreCase(name))
connectState = device.getBondState();
switch (connectState)
case BluetoothDevice.BOND_NONE:
break;
case BluetoothDevice.BOND_BONDING:
break;
case BluetoothDevice.BOND_BONDED:
try
// 连接
connect(device);
catch (IOException e)
e.printStackTrace();
break;
6.蓝牙设备的连接
[java]
private void connect(BluetoothDevice device) throws IOException
// 固定的UUID
final String SPP_UUID = "00001101-0000-1000-8000-00805F9B34FB";
UUID uuid = UUID.fromString(SPP_UUID);
BluetoothSocket socket = device.createRfcommSocketToServiceRecord(uuid);
socket.connect();
private void connect(BluetoothDevice device) throws IOException
// 固定的UUID
final String SPP_UUID = "00001101-0000-1000-8000-00805F9B34FB";
UUID uuid = UUID.fromString(SPP_UUID);
BluetoothSocket socket = device.createRfcommSocketToServiceRecord(uuid);
socket.connect();
如何将 HTC 安卓手机连接到电脑作为调试设备
【中文标题】如何将 HTC 安卓手机连接到电脑作为调试设备【英文标题】:How to connect a HTC android phone to the pc as debugging device 【发布时间】:2010-11-04 17:48:03 【问题描述】:我想将 HTC Desire 仅作为调试设备连接到电脑。 每次我插入数据线时,它都会在电脑上搜索 HTC Sync 软件,这需要很长时间,直到手机上最终出现一条消息,例如“找不到 HTC Sync,...请安装...”。之后,手机就可以eclipse进行调试了。但是我怎样才能避免这个永恒的搜索过程呢?
【问题讨论】:
那么问题出在哪里?你已经接受了我的回答,但我真的很好奇你为什么会遇到这个问题。 好吧,我仍然不知道为什么每次连接手机都必须等待 HTC Sync,而且我对这里给出的所有答案都不是很满意。我的连接工作正常,驱动程序没有问题。我只是想知道其他人是否也遇到了 HTC Sync 的麻烦。但似乎我是唯一一个对这个搜索过程感到恼火的人。所以我决定尝试安装 HTC Sync 软件。如果您遇到另一种解决此问题的方法,如果您让我知道,我会很高兴... 通常在这种困难的情况下,问题不是由您直接使用的程序引起的。在这种特殊情况下,问题可能是由您在 HTC 上安装的某些应用程序引起的。也检查一下Android Logcat,也许你会找到线索。 【参考方案1】:以下是从this page 复制的。非常适合我。请记住按照 Android 文档中描述的过程如何连接设备进行调试。
HTC 的愿望适用于 ADB 驱动程序的 v3 版本 - 无需安装 HTC Sync。将这些行添加到 android_winusb.inf:
[Google.NTx86] ;HTC 渴望 %SingleAdbInterface% = USB_Install, USB\VID_0BB4&PID_0C87 %CompositeAdbInterface% = USB_Install, USB\VID_0BB4&PID_0C87&MI_01
[Google.NTamd64] ;HTC 渴望 %SingleAdbInterface% = USB_Install, USB\VID_0BB4&PID_0C87 %CompositeAdbInterface% = USB_Install, USB\VID_0BB4&PID_0C87&MI_01
【讨论】:
谢谢,我知道我不需要安装 HTC Sync!正如我所写,我唯一的问题是,在 HTC 的愿望上,只有四个选项“HTC Sync”、“仅充电”、“硬盘”、“USB 连接(移动网络)”。除了“HTC Sync”之外,这些选项都不适用于调试。如果我选择它,“Android设备选择器”会找到手机,但手机会在电脑上搜索HTC软件... 或者您给出的解决方案是否意味着手机不进行搜索?我试试看…… 嗯,我试过了......这并没有改变任何东西......我仍然需要等到搜索完成 对我来说,“仅收费”选项有效。据我记得“磁盘驱动器”也有效。如果没有上述修改,Android SDK USB 驱动程序无法找到我的 HTC Desire。所以我有两个选择:(1)在我的电脑上安装 HTC Sync(2)修复 Android USB 驱动程序。 也许您安装了 HTC 驱动程序后端,需要将其删除,以便停止寻找前端同步软件?【参考方案2】:尝试为您的设备选择“仅充电”连接模式作为默认连接。现在,您似乎选择了默认同步的内容。
设置 -> 连接到 PC -> 默认连接类型
【讨论】:
谢谢,但你试过吗?如果您选择“仅充电”选项,则找不到任何 Android 设备! 好吧,我通常不使用 Windows。但在 Linux 上绝对有效。我还记得当我尝试使用 Window 时,我的 Desire 并没有使用 SDK 驱动程序,直到我从设备闪存卡安装了一些东西。可能 HTC 有自己的驱动程序,或者您只需安装该同步应用程序即可使其正常工作。 myhtcdesire.com/tutorials/… 这里是关于如何为 HTC 安装驱动程序的手册。最后有我猜的替代驱动程序的链接。【参考方案3】:在 Android 2.2 中,它的设置 -> 应用程序 -> 开发 -> USB 调试(启用)。
【讨论】:
我知道 - 当然,USB 调试已启用,并且可以正常工作(正如我在上面所写的)。但它每次都会搜索 HTC Sync!以上是关于这段 安卓软件中的代码中如何判断 手机是不是连接到 蓝牙设备的主要内容,如果未能解决你的问题,请参考以下文章