В настоящее время у меня устройства успешно «рекламируют» и «обнаруживают» одновременно, но приложение не обнаруживает себя и никогда не подключается. Вот класс, который я использую для его вызова.
Код: Выделить всё
import android.annotation.SuppressLint;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.bluetooth.BluetoothServerSocket;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;
import android.widget.Toast;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
@SuppressLint("MissingPermission")
public class BluetoothConnectionManager {
private static final String TAG = "BluetoothConnManager";
private static final UUID APP_UUID = UUID.fromString("29f9fac1-db57-4a3f-b91e-98f2a1139a16"); // Generate a unique UUID
private static final String APP_NAME = "MyBluetoothApp"; // Your app name
private BluetoothAdapter bluetoothAdapter;
private BluetoothSocket bluetoothSocket;
private BluetoothServerSocket serverSocket;
private Context context;
public BluetoothConnectionManager(Context context) {
this.context = context;
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
// Register for Bluetooth scan results (for RSSI)
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
context.registerReceiver(receiver, filter);
}
// Start discovering devices
public void startDeviceDiscovery() {
if (bluetoothAdapter != null && bluetoothAdapter.isEnabled()) {
bluetoothAdapter.startDiscovery();
Toast toast = Toast.makeText(context, "Discovery Started", Toast.LENGTH_SHORT);
toast.show();
}
}
// BroadcastReceiver to handle discovered devices and RSSI
private final BroadcastReceiver receiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
// Get the BluetoothDevice and RSSI
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
int rssi = intent.getShortExtra(BluetoothDevice.EXTRA_RSSI, Short.MIN_VALUE);
Log.d(TAG, "Device found: " + device.getName() + " RSSI: " + rssi);
// Check the RSSI and if it's strong enough, attempt to connect
if(rssi > -75) {
connectToDevice(device);
BluetoothFileTransfer bluetoothFileTransfer = new BluetoothFileTransfer(bluetoothSocket, context);
File fileToSend = new File(context.getFilesDir(), "contact.json");
File fileToRecieve = new File(context.getFilesDir(), "recievedContact.json");
bluetoothFileTransfer.startFileTransfer(fileToSend,fileToRecieve);
try {
wait(10000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
closeConnection();
cleanup();
}
}
}
};
// Establish connection with a device
private void connectToDevice(BluetoothDevice device) {
try {
bluetoothSocket = device.createRfcommSocketToServiceRecord(APP_UUID);
bluetoothAdapter.cancelDiscovery(); // Cancel discovery as it impacts performance
// Try to connect
bluetoothSocket.connect();
Log.d(TAG, "Connected to " + device.getName());
Toast toast = Toast.makeText(context, "Connected to device", Toast.LENGTH_SHORT);
toast.show();
} catch (IOException e) {
Log.e(TAG, "Connection failed", e);
closeConnection();
}
}
// Close connection if any
public void closeConnection() {
try {
if (bluetoothSocket != null) {
bluetoothSocket.close();
}
} catch (IOException e) {
Log.e(TAG, "Failed to close connection", e);
}
}
// Set up server socket to listen for connections
public void startServer() {
new Thread(() -> {
try {
serverSocket = bluetoothAdapter.listenUsingRfcommWithServiceRecord(APP_NAME, APP_UUID);
Log.d(TAG, "Server started");
bluetoothSocket = serverSocket.accept(); // Blocking call
Log.d(TAG, "Server accepted connection");
} catch (IOException e) {
Log.e(TAG, "Failed to start server", e);
}
}).start();
}
// Stop discovery and unregister receiver
public void cleanup() {
bluetoothAdapter.cancelDiscovery();
try {
serverSocket.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
context.unregisterReceiver(receiver);
}
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... oth-that-a