gpt4 book ai didi

android - BluetoothSocket.connect() 抛出 IOException

转载 作者:行者123 更新时间:2023-11-29 18:10:31 24 4
gpt4 key购买 nike

我的程序与充当服务器的嵌入式蓝牙设备连接。我成功找到了附近的蓝牙设备,但是当我尝试连接到新设备时,我的程序因调用 BluetoothSocket.connect() 时出现 IO 异常而崩溃。我无法弄清楚发生了什么,所以如果有人可以帮助我,我将不胜感激。

我觉得可能和我随机生成的UUID有关系,但我不完全确定。

谢谢。

    public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

btnScanDevice = (Button) findViewById( R.id.scandevice );

stateBluetooth = (TextView) findViewById( R.id.bluetoothstate );
startBluetooth();

listDevicesFound = (ListView) findViewById( R.id.devicesfound );
btArrayAdapter = new ArrayAdapter<String>( AndroidBluetooth.this,
android.R.layout.simple_list_item_1 );
listDevicesFound.setAdapter( btArrayAdapter );

CheckBlueToothState();

btnScanDevice.setOnClickListener( btnScanDeviceOnClickListener );

registerReceiver( ActionFoundReceiver, new IntentFilter( BluetoothDevice.ACTION_FOUND ) );

listDevicesFound.setOnItemClickListener( new OnItemClickListener()
{
public void onItemClick(AdapterView<?> arg0, View arg1,int arg2, long arg3)
{
myBtDevice = btDevicesFound.get( arg2 );
try {
btSocket = myBtDevice.createRfcommSocketToServiceRecord( MY_UUID );
iStream = btSocket.getInputStream();
oStream = btSocket.getOutputStream();
} catch ( IOException e ) {
Log.e( "Bluetooth Socket", "Bluetooth not available, or insufficient permissions" );
} catch ( NullPointerException e ) {
Log.e( "Bluetooth Socket", "Null Pointer One" );
}
myBtAdapter.cancelDiscovery();
CheckBlueToothState();
try {
btSocket.connect();
} catch ( IOException e ) {
Log.e( "Bluetooth Socket", "IO Exception" );
} catch ( NullPointerException e ) {
Log.e( "Bluetooth Socket", "Null Pointer Two" );
}
}

});
}

private void CheckBlueToothState() {
if( myBtAdapter == null ) {
stateBluetooth.setText("Bluetooth NOT supported" );
} else {
if( myBtAdapter.isEnabled() ) {
if( myBtAdapter.isDiscovering() ) {
stateBluetooth.setText( "Bluetooth is currently " +
"in device discovery process." );
} else {
stateBluetooth.setText( "Bluetooth is Enabled." );
btnScanDevice.setEnabled( true );
}
} else {
stateBluetooth.setText( "Bluetooth is NOT enabled" );
Intent enableBtIntent = new Intent( BluetoothAdapter.ACTION_REQUEST_ENABLE );
startActivityForResult( enableBtIntent, REQUEST_ENABLE_BT );
}
}
}

private Button.OnClickListener btnScanDeviceOnClickListener = new Button.OnClickListener() {
public void onClick( View arg0 ) {
btArrayAdapter.clear();
myBtAdapter.startDiscovery();
}
};


@Override
protected void onActivityResult( int requestCode, int resultCode, Intent data ) {
if( requestCode == REQUEST_ENABLE_BT ) {
CheckBlueToothState();
}
}

private final BroadcastReceiver ActionFoundReceiver = new BroadcastReceiver() {
public void onReceive( Context context, Intent intent ) {
String action = intent.getAction();
if( BluetoothDevice.ACTION_FOUND.equals( action ) ) {
BluetoothDevice btDevice = intent.getParcelableExtra( BluetoothDevice.EXTRA_DEVICE );
btDevicesFound.add( btDevice );
btArrayAdapter.add( btDevice.getName() + "\n" + btDevice.getAddress() );
btArrayAdapter.notifyDataSetChanged();
}
}
};
public static void startBluetooth(){
try {
myBtAdapter = BluetoothAdapter.getDefaultAdapter();
myBtAdapter.enable();
} catch ( NullPointerException ex ) {
Log.e( "Bluetooth", "Device not available" );
}
}

public static void stopBluetooth() {
myBtAdapter.disable();
}

最佳答案

您发布的代码有两个问题,但只有一个与您的崩溃有关。

很可能您在 logcat 中的崩溃显示类似“命令被拒绝”的内容。 UUID 是一个必须指向嵌入式设备上已发布服务的值,它不能随机生成。换句话说,您要访问的 RFCOMM SPP 连接具有一个特定的 UUID,它发布该 UUID 以标识该服务,并且当您创建套接字时,它必须使用匹配的 UUID。

This blog post I wrote可能会帮助您了解如何查询您的设备以获得需要插入到您的程序中的正确 UUID。在 Android 4.0 之前,SDK 几乎假定您提前知道它(您从蓝牙 OEM 等处获得它),因此从您的设备发现它有点迂回。如果您有幸拥有 4.0.3 设备,fetchUuidsWithSdp()getUuids() 现在是公共(public)方法,您可以直接调用它们以查找所有已发布的服务和它们关联的 UUID 值。

你的代码的第二个问题可能会在以后遇到你,那就是在你连接之前你无法从你的套接字获取数据流,所以你可能需要像这样重写你的方法:

      myBtDevice = btDevicesFound.get( arg2 );
try {
btSocket = myBtDevice.createRfcommSocketToServiceRecord( MY_UUID );
} catch ( IOException e ) {
Log.e( "Bluetooth Socket", "Bluetooth not available, or insufficient permissions" );
}

myBtAdapter.cancelDiscovery();
CheckBlueToothState();
try {
btSocket.connect();
//Get streams after connect() returns without error
iStream = btSocket.getInputStream();
oStream = btSocket.getOutputStream();
} catch ( IOException e ) {
Log.e( "Bluetooth Socket", "IO Exception" );
} catch ( NullPointerException e ) {
Log.e( "Bluetooth Socket", "Null Pointer Two" );
}

HTH

关于android - BluetoothSocket.connect() 抛出 IOException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10986285/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com