package id.aashari.code.miband2.Activities; import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothGatt; import android.bluetooth.BluetoothGattCallback; import android.bluetooth.BluetoothGattCharacteristic; import android.bluetooth.BluetoothGattDescriptor; import android.bluetooth.BluetoothProfile; 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.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import java.util.Arrays; import java.util.Set; import id.aashari.code.miband2.Helpers.CustomBluetoothProfile; import id.aashari.code.miband2.R; public class MainActivity extends Activity { Boolean isListeningHeartRate = false; public static final String EXTRAS_DEVICE_NAME = "DEVICE_NAME"; public static final String EXTRAS_DEVICE_ADDRESS = "DEVICE_ADDRESS"; BluetoothAdapter bluetoothAdapter; BluetoothGatt bluetoothGatt; BluetoothDevice bluetoothDevice; Button btnStartConnecting, btnGetBatteryInfo, btnGetHeartRate, btnWalkingInfo, btnStartVibrate, btnStopVibrate; EditText txtPhysicalAddress; TextView txtState, txtByte; private String mDeviceName; private String mDeviceAddress; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initializeObjects(); initilaizeComponents(); initializeEvents(); getBoundedDevice(); } void getBoundedDevice() { mDeviceName = getIntent().getStringExtra(EXTRAS_DEVICE_NAME); mDeviceAddress = getIntent().getStringExtra(EXTRAS_DEVICE_ADDRESS); txtPhysicalAddress.setText(mDeviceAddress); Set<BluetoothDevice> boundedDevice = bluetoothAdapter.getBondedDevices(); for (BluetoothDevice bd : boundedDevice) { if (bd.getName().contains("MI Band 2")) { txtPhysicalAddress.setText(bd.getAddress()); } } } void initializeObjects() { bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); } void initilaizeComponents() { btnStartConnecting = (Button) findViewById(R.id.btnStartConnecting); btnGetBatteryInfo = (Button) findViewById(R.id.btnGetBatteryInfo); btnWalkingInfo = (Button) findViewById(R.id.btnWalkingInfo); btnStartVibrate = (Button) findViewById(R.id.btnStartVibrate); btnStopVibrate = (Button) findViewById(R.id.btnStopVibrate); btnGetHeartRate = (Button) findViewById(R.id.btnGetHeartRate); txtPhysicalAddress = (EditText) findViewById(R.id.txtPhysicalAddress); txtState = (TextView) findViewById(R.id.txtState); txtByte = (TextView) findViewById(R.id.txtByte); } void initializeEvents() { btnStartConnecting.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startConnecting(); } }); btnGetBatteryInfo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getBatteryStatus(); } }); btnStartVibrate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startVibrate(); } }); btnStopVibrate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { stopVibrate(); } }); btnGetHeartRate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startScanHeartRate(); } }); } void startConnecting() { String address = txtPhysicalAddress.getText().toString(); bluetoothDevice = bluetoothAdapter.getRemoteDevice(address); Log.v("test", "Connecting to " + address); Log.v("test", "Device name " + bluetoothDevice.getName()); bluetoothGatt = bluetoothDevice.connectGatt(this, true, bluetoothGattCallback); } void stateConnected() { bluetoothGatt.discoverServices(); txtState.setText("Connected"); } void stateDisconnected() { bluetoothGatt.disconnect(); txtState.setText("Disconnected"); } void startScanHeartRate() { txtByte.setText("..."); BluetoothGattCharacteristic bchar = bluetoothGatt.getService(CustomBluetoothProfile.HeartRate.service) .getCharacteristic(CustomBluetoothProfile.HeartRate.controlCharacteristic); bchar.setValue(new byte[]{21, 2, 1}); bluetoothGatt.writeCharacteristic(bchar); } void listenHeartRate() { BluetoothGattCharacteristic bchar = bluetoothGatt.getService(CustomBluetoothProfile.HeartRate.service) .getCharacteristic(CustomBluetoothProfile.HeartRate.measurementCharacteristic); bluetoothGatt.setCharacteristicNotification(bchar, true); BluetoothGattDescriptor descriptor = bchar.getDescriptor(CustomBluetoothProfile.HeartRate.descriptor); descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); bluetoothGatt.writeDescriptor(descriptor); isListeningHeartRate = true; } void getBatteryStatus() { txtByte.setText("..."); BluetoothGattCharacteristic bchar = bluetoothGatt.getService(CustomBluetoothProfile.Basic.service) .getCharacteristic(CustomBluetoothProfile.Basic.batteryCharacteristic); if (!bluetoothGatt.readCharacteristic(bchar)) { Toast.makeText(this, "Failed get battery info", Toast.LENGTH_SHORT).show(); } } void startVibrate() { BluetoothGattCharacteristic bchar = bluetoothGatt.getService(CustomBluetoothProfile.AlertNotification.service) .getCharacteristic(CustomBluetoothProfile.AlertNotification.alertCharacteristic); bchar.setValue(new byte[]{2}); if (!bluetoothGatt.writeCharacteristic(bchar)) { Toast.makeText(this, "Failed start vibrate", Toast.LENGTH_SHORT).show(); } } void stopVibrate() { BluetoothGattCharacteristic bchar = bluetoothGatt.getService(CustomBluetoothProfile.AlertNotification.service) .getCharacteristic(CustomBluetoothProfile.AlertNotification.alertCharacteristic); bchar.setValue(new byte[]{0}); if (!bluetoothGatt.writeCharacteristic(bchar)) { Toast.makeText(this, "Failed stop vibrate", Toast.LENGTH_SHORT).show(); } } final BluetoothGattCallback bluetoothGattCallback = new BluetoothGattCallback() { @Override public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { super.onConnectionStateChange(gatt, status, newState); Log.v("test", "onConnectionStateChange"); if (newState == BluetoothProfile.STATE_CONNECTED) { stateConnected(); } else if (newState == BluetoothProfile.STATE_DISCONNECTED) { stateDisconnected(); } } @Override public void onServicesDiscovered(BluetoothGatt gatt, int status) { super.onServicesDiscovered(gatt, status); Log.v("test", "onServicesDiscovered"); listenHeartRate(); } @Override public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { super.onCharacteristicRead(gatt, characteristic, status); Log.v("test", "onCharacteristicRead"); byte[] data = characteristic.getValue(); txtByte.setText(Arrays.toString(data)); } @Override public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { super.onCharacteristicWrite(gatt, characteristic, status); Log.v("test", "onCharacteristicWrite"); } @Override public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { super.onCharacteristicChanged(gatt, characteristic); Log.v("test", "onCharacteristicChanged"); byte[] data = characteristic.getValue(); txtByte.setText(Arrays.toString(data)); } @Override public void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) { super.onDescriptorRead(gatt, descriptor, status); Log.v("test", "onDescriptorRead"); } @Override public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) { super.onDescriptorWrite(gatt, descriptor, status); Log.v("test", "onDescriptorWrite"); } @Override public void onReliableWriteCompleted(BluetoothGatt gatt, int status) { super.onReliableWriteCompleted(gatt, status); Log.v("test", "onReliableWriteCompleted"); } @Override public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) { super.onReadRemoteRssi(gatt, rssi, status); Log.v("test", "onReadRemoteRssi"); } @Override public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) { super.onMtuChanged(gatt, mtu, status); Log.v("test", "onMtuChanged"); } }; }