Last active
December 24, 2019 11:06
-
-
Save sidishere/423f7572d4b042fcf5cdf5c6f58a0fa2 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import androidx.annotation.Nullable; | |
import androidx.appcompat.app.AppCompatActivity; | |
import android.bluetooth.BluetoothAdapter; | |
import android.bluetooth.BluetoothDevice; | |
import android.content.BroadcastReceiver; | |
import android.content.Context; | |
import android.content.Intent; | |
import android.content.IntentFilter; | |
import android.os.Bundle; | |
import android.util.Log; | |
import android.view.View; | |
import android.widget.AdapterView; | |
import android.widget.ArrayAdapter; | |
import android.widget.Button; | |
import android.widget.ListView; | |
import android.widget.TextView; | |
import android.widget.Toast; | |
import java.util.Set; | |
public class MainActivity extends AppCompatActivity | |
{ | |
private BluetoothAdapter bluetoothAdapter; | |
Button scanButton; | |
private static final int REQUEST_ENABLE_BT = 1; | |
private ArrayAdapter<String> mNewDevicesArrayAdapter; | |
@Override | |
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) | |
{ | |
super.onActivityResult(requestCode, resultCode, data); | |
if(resultCode == RESULT_CANCELED) Toast.makeText(this,"Please provide permission to turn on bluetooth",Toast.LENGTH_SHORT).show(); | |
} | |
@Override | |
protected void onCreate(Bundle savedInstanceState) | |
{ | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.activity_main); | |
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); | |
if (bluetoothAdapter == null) | |
{ | |
Toast.makeText(this, "Device does not support bluetooth", Toast.LENGTH_SHORT).show(); | |
finish(); | |
} | |
else if (!bluetoothAdapter.isEnabled()) | |
{ | |
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); | |
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); | |
} | |
scanButton = (Button) findViewById(R.id.button_scan); | |
scanButton.setOnClickListener(new View.OnClickListener() | |
{ | |
public void onClick(View v) | |
{ | |
doDiscovery(); | |
v.setVisibility(View.GONE); | |
} | |
}); | |
// Initialize array adapters. One for already paired devices and | |
// one for newly discovered devices | |
ArrayAdapter<String> pairedDevicesArrayAdapter = new ArrayAdapter<String>(this, R.layout.device_name); | |
mNewDevicesArrayAdapter = new ArrayAdapter<String>(this, R.layout.device_name); | |
// Find and set up the ListView for paired devices | |
ListView pairedListView = (ListView) findViewById(R.id.paired_devices); | |
pairedListView.setAdapter(pairedDevicesArrayAdapter); | |
pairedListView.setOnItemClickListener(mDeviceClickListener); | |
// Find and set up the ListView for newly discovered devices | |
ListView newDevicesListView = (ListView) findViewById(R.id.new_devices); | |
newDevicesListView.setAdapter(mNewDevicesArrayAdapter); | |
newDevicesListView.setOnItemClickListener(mDeviceClickListener); | |
// Register for broadcasts when a device is discovered | |
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); | |
this.registerReceiver(mReceiver, filter); | |
// Register for broadcasts when discovery has finished | |
filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); | |
this.registerReceiver(mReceiver, filter); | |
// Get a set of currently paired devices | |
Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices(); | |
// If there are paired devices, add each one to the ArrayAdapter | |
if (pairedDevices.size() > 0) | |
{ | |
findViewById(R.id.title_paired_devices).setVisibility(View.VISIBLE); | |
for (BluetoothDevice device : pairedDevices) | |
{ | |
pairedDevicesArrayAdapter.add(device.getName() + "\n" + device.getAddress()); | |
} | |
} | |
else { | |
String noDevices = "No paired devices found"; | |
pairedDevicesArrayAdapter.add(noDevices); | |
} | |
} | |
@Override | |
protected void onDestroy() { super.onDestroy(); | |
// Make sure we're not doing discovery anymore | |
if (bluetoothAdapter != null) { bluetoothAdapter.cancelDiscovery(); | |
} | |
// Unregister broadcast listeners | |
this.unregisterReceiver(mReceiver); | |
} | |
private void doDiscovery() | |
{ | |
Log.d("TAG", "doDiscovery()"); | |
// Indicate scanning in the title | |
setProgressBarIndeterminateVisibility(true); | |
setTitle("discovering new devices"); | |
// Turn on sub-title for new devices | |
findViewById(R.id.title_new_devices).setVisibility(View.VISIBLE); | |
// If we're already discovering, stop it | |
if (bluetoothAdapter.isDiscovering()) | |
{ bluetoothAdapter.cancelDiscovery(); | |
} | |
// Request discover from BluetoothAdapter | |
bluetoothAdapter.startDiscovery(); | |
} | |
private AdapterView.OnItemClickListener mDeviceClickListener = new AdapterView.OnItemClickListener() | |
{ | |
public void onItemClick(AdapterView<?> av, View v, int arg2, long arg3) | |
{ | |
// Cancel discovery because it's costly and we're about to connect | |
bluetoothAdapter.cancelDiscovery(); | |
Toast.makeText(getApplicationContext(),"Stopping discovery",Toast.LENGTH_SHORT).show(); | |
// Get the device MAC address, which is the last 17 chars in the View String | |
info = ((TextView) v).getText().toString(); | |
String address = info.substring(info.length() - 17); | |
// Create the result Intent and include the MAC address | |
Intent intent = new Intent(MainActivity.this,LedControl.class); | |
intent.putExtra("DEVICE_ADDRESS", address); | |
// Set result and finish this Activity | |
startActivity(intent); | |
} | |
} | |
; /** * The BroadcastReceiver that listens for discovered devices and changes the title when * discovery is finished */ | |
private final BroadcastReceiver mReceiver = new BroadcastReceiver() { | |
@Override | |
public void onReceive(Context context, Intent intent) | |
{ | |
String action = intent.getAction(); | |
// When discovery finds a device | |
if (BluetoothDevice.ACTION_FOUND.equals(action)) | |
{ | |
// Get the BluetoothDevice object from the Intent | |
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); | |
// If it's already paired, skip it, because it's been listed already | |
if (device.getBondState() != BluetoothDevice.BOND_BONDED) | |
{ | |
mNewDevicesArrayAdapter.add(device.getName() + "\n" + device.getAddress()); | |
} | |
// When discovery is finished, change the Activity title | |
} | |
else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) | |
{ | |
setProgressBarIndeterminateVisibility(false); | |
setTitle("Select a device to connect"); | |
if (mNewDevicesArrayAdapter.getCount() == 0) | |
{ | |
String noDevices = "No devices"; | |
mNewDevicesArrayAdapter.add(noDevices); | |
} | |
} | |
} | |
}; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment