Android Sample Code for Scanning
1. Add Permissions to AndroidManifest.xml
2. Implement the Java Code (MainActivity.java)
import android.Manifest;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "BluetoothScan";
private static final int PERMISSION_REQUEST_CODE = 101;
private BluetoothAdapter bluetoothAdapter;
private Button scanButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
scanButton = findViewById(R.id.scanButton); // Assumes you have a button in your XML layout
// Initialize Bluetooth Adapter
BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
if (bluetoothManager != null) {
bluetoothAdapter = bluetoothManager.getAdapter();
}
scanButton.setOnClickListener(v -> checkPermissionsAndScan());
}
// Create a BroadcastReceiver to listen for discovered devices
private final BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
// A device was found
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (device != null) {
// Check for permission before accessing name (Required for Android 12+)
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.BLUETOOTH_CONNECT)
== PackageManager.PERMISSION_GRANTED || Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
String deviceName = device.getName();
String deviceHardwareAddress = device.getAddress(); // MAC address
Log.d(TAG, "Device Found: " + deviceName + " [" + deviceHardwareAddress + "]");
// TODO: Add the device details to a ListView or RecyclerView adapter here
}
}
} else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
Log.d(TAG, "Scan finished.");
}
}
};
private void checkPermissionsAndScan() {
if (bluetoothAdapter == null) {
Log.e(TAG, "Device does not support Bluetooth");
return;
}
// Determine required permissions based on Android version
String[] permissions;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
permissions = new String[]{Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BLUETOOTH_CONNECT};
} else {
permissions = new String[]{Manifest.permission.ACCESS_FINE_LOCATION};
}
// Request permissions if not already granted
if (!hasPermissions(permissions)) {
ActivityCompat.requestPermissions(this, permissions, PERMISSION_REQUEST_CODE);
} else {
startBluetoothDiscovery();
}
}
private boolean hasPermissions(String... permissions) {
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
private void startBluetoothDiscovery() {
// Safe check for Android 12+ runtime compliance
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED
&& Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
return;
}
// If already discovering, cancel it first to restart cleanly
if (bluetoothAdapter.isDiscovering()) {
bluetoothAdapter.cancelDiscovery();
}
// Register for broadcasts when a device is discovered
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothDevice.ACTION_FOUND);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
registerReceiver(receiver, filter);
// Start looking for devices (Asynchronous 12-second process)
bluetoothAdapter.startDiscovery();
Log.d(TAG, "Scanning started...");
}
@Override
protected void onDestroy() {
super.onDestroy();
// Unregister the runtime receiver to prevent memory leaks
try {
unregisterReceiver(receiver);
} catch (IllegalArgumentException e) {
Log.w(TAG, "Receiver was not registered or already unregistered.");
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSION_REQUEST_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
startBluetoothDiscovery();
} else {
Log.e(TAG, "Permissions denied. Cannot scan for devices.");
}
}
}
}