I'm working on an Android app that scans for Bluetooth devices and print receipt. I'm trying to check for Bluetooth permissions and request them if necessary. However, I am getting an exception during the printing process. below is main activity method for checking bluetooth
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_ENABLE_BT) {
if (resultCode == RESULT_OK) {
// Bluetooth has been enabled, start device discovery
startDeviceDiscovery();
} else {
// Bluetooth was not enabled, handle accordingly
Toast.makeText(this, "Bluetooth needs to be enabled to use this feature", Toast.LENGTH_SHORT).show();
}
}
}
And this was method for for device discovery
private void startDeviceDiscovery() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED ||
ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_ADMIN) != PackageManager.PERMISSION_GRANTED) {
// Request the necessary permissions
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BLUETOOTH_ADMIN},
REQUEST_BLUETOOTH_PERMISSIONS);
} else {
// Permissions are already granted, start discovery
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (bluetoothAdapter.isDiscovering()) {
bluetoothAdapter.cancelDiscovery();
}
bluetoothAdapter.startDiscovery();
Toast.makeText(this, "Starting Bluetooth device discovery", Toast.LENGTH_SHORT).show();
}
}
when app running, I always getting the toast message of "Bluetooth needs to be enabled to use this feature"
I already added the permissions, here
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.NFC" />
<uses-permission
android:name="android.permission.BLUETOOTH_SCAN"
android:usesPermissionFlags="neverForLocation"
tools:targetApi="s" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission
android:name="android.permission.ACCESS_COARSE_LOCATION"
android:maxSdkVersion="30" />
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION"
android:maxSdkVersion="30" />
also, I used the class for manage bluetooth named PrinterSDK openBt method, this was it,
public boolean openBT() throws IOException {
try {
// Standard SerialPortService ID
UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);
Method createMethod = mmDevice.getClass().getMethod("createInsecureRfcommSocket", new Class[] { int.class });
mmSocket = (BluetoothSocket)createMethod.invoke(mmDevice, 1);
System.out.println(mmSocket);
Log.d("PrinterSDK", "Socket created successfully. mmSocket: " + mmSocket);
mBluetoothAdapter.cancelDiscovery();
mmSocket.connect();
mmOutputStream = mmSocket.getOutputStream();
mmInputStream = mmSocket.getInputStream();
beginListenForData();
} catch (Exception e) {
Log.e("PrinterSDK", "Error in openBT: " + e.getMessage(), e);
e.printStackTrace();
}
return mmSocket.isConnected();
}
And there was an exception when running openBT method in PrinterSDK Class, its below
2025-01-21 16:25:04.290 16950-16950 PrinterSDK sales.smtk.mmc D Socket created successfully. mmSocket: android.bluetooth.BluetoothSocket@fa34793 2025-01-21 16:25:09.515 16950-16950 PrinterSDK sales.smtk.mmc E Error in openBT: read failed, socket might closed or timeout, read ret: -1 java.io.IOException: read failed, socket might closed or timeout, read ret: -1 at android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.java:758) at android.bluetooth.BluetoothSocket.waitSocketSignal(BluetoothSocket.java:711) at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:409) at sales.smtk.mmc.PrinterSDK.openBT(PrinterSDK.java:130) at sales.smtk.mmc.Receipt$10.onClick(Receipt.java:480) at androidx.appcompat.app.AlertController$ButtonHandler.handleMessage(AlertController.java:167) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:233) at android.app.ActivityThread.main(ActivityThread.java:8063) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:631) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:978) 2025-01-21 16:25:09.515 16950-16950 System.err sales.smtk.mmc W at sales.smtk.mmc.PrinterSDK.openBT(PrinterSDK.java:130)
Can anyone help me to fix this, I don't have idea what was the error