Android Open Source - BLERW Device Activity






From Project

Back to project page BLERW.

License

The source code is released under:

Apache License

If you think the Android project BLERW listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 * Copyright (C) 2013 youten/*from   w w w  . ja v a 2 s  . c  o m*/
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package youten.redo.ble.readwrite;

import java.util.UUID;

import youten.redo.ble.util.BleUtil;
import youten.redo.ble.util.BleUuid;
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.BluetoothGattService;
import android.bluetooth.BluetoothManager;
import android.bluetooth.BluetoothProfile;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.Toast;

/**
 * BLE???????????connect?Service
 * Discovery????????Characteristics???read/write????????????Activity
 */
public class DeviceActivity extends Activity implements View.OnClickListener {
  private static final String TAG = "BLEDevice";

  public static final String EXTRA_BLUETOOTH_DEVICE = "BT_DEVICE";
  private BluetoothAdapter mBTAdapter;
  private BluetoothDevice mDevice;
  private BluetoothGatt mConnGatt;
  private int mStatus;

  private Button mReadManufacturerNameButton;
  private Button mReadSerialNumberButton;
  private Button mWriteAlertLevelButton;

  private final BluetoothGattCallback mGattcallback = new BluetoothGattCallback() {
    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status,
        int newState) {
      if (newState == BluetoothProfile.STATE_CONNECTED) {
        mStatus = newState;
        mConnGatt.discoverServices();
      } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
        mStatus = newState;
        runOnUiThread(new Runnable() {
          public void run() {
            mReadManufacturerNameButton.setEnabled(false);
            mReadSerialNumberButton.setEnabled(false);
            mWriteAlertLevelButton.setEnabled(false);
          };
        });
      }
    };

    @Override
    public void onServicesDiscovered(BluetoothGatt gatt, int status) {
      for (BluetoothGattService service : gatt.getServices()) {
        if ((service == null) || (service.getUuid() == null)) {
          continue;
        }
        if (BleUuid.SERVICE_DEVICE_INFORMATION.equalsIgnoreCase(service
            .getUuid().toString())) {
          mReadManufacturerNameButton
              .setTag(service.getCharacteristic(UUID
                  .fromString(BleUuid.CHAR_MANUFACTURER_NAME_STRING)));
          mReadSerialNumberButton
              .setTag(service.getCharacteristic(UUID
                  .fromString(BleUuid.CHAR_SERIAL_NUMBEAR_STRING)));
          runOnUiThread(new Runnable() {
            public void run() {
              mReadManufacturerNameButton.setEnabled(true);
              mReadSerialNumberButton.setEnabled(true);
            };
          });
        }
        if (BleUuid.SERVICE_IMMEDIATE_ALERT.equalsIgnoreCase(service
            .getUuid().toString())) {
          runOnUiThread(new Runnable() {
            public void run() {
              mWriteAlertLevelButton.setEnabled(true);
            };
          });
          mWriteAlertLevelButton.setTag(service
              .getCharacteristic(UUID
                  .fromString(BleUuid.CHAR_ALERT_LEVEL)));
        }
      }

      runOnUiThread(new Runnable() {
        public void run() {
          setProgressBarIndeterminateVisibility(false);
        };
      });
    };

    @Override
    public void onCharacteristicRead(BluetoothGatt gatt,
        BluetoothGattCharacteristic characteristic, int status) {
      if (status == BluetoothGatt.GATT_SUCCESS) {
        if (BleUuid.CHAR_MANUFACTURER_NAME_STRING
            .equalsIgnoreCase(characteristic.getUuid().toString())) {
          final String name = characteristic.getStringValue(0);

          runOnUiThread(new Runnable() {
            public void run() {
              mReadManufacturerNameButton.setText(name);
              setProgressBarIndeterminateVisibility(false);
            };
          });
        } else if (BleUuid.CHAR_SERIAL_NUMBEAR_STRING
            .equalsIgnoreCase(characteristic.getUuid().toString())) {
          final String name = characteristic.getStringValue(0);

          runOnUiThread(new Runnable() {
            public void run() {
              mReadSerialNumberButton.setText(name);
              setProgressBarIndeterminateVisibility(false);
            };
          });
        }

      }
    }

    @Override
    public void onCharacteristicWrite(BluetoothGatt gatt,
        BluetoothGattCharacteristic characteristic, int status) {

      runOnUiThread(new Runnable() {
        public void run() {
          setProgressBarIndeterminateVisibility(false);
        };
      });
    };
  };

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
    setContentView(R.layout.activity_device);

    // state
    mStatus = BluetoothProfile.STATE_DISCONNECTED;
    mReadManufacturerNameButton = (Button) findViewById(R.id.read_manufacturer_name_button);
    mReadManufacturerNameButton.setOnClickListener(this);
    mReadSerialNumberButton = (Button) findViewById(R.id.read_serial_number_button);
    mReadSerialNumberButton.setOnClickListener(this);
    mWriteAlertLevelButton = (Button) findViewById(R.id.write_alert_level_button);
    mWriteAlertLevelButton.setOnClickListener(this);
  }

  @Override
  protected void onResume() {
    super.onResume();

    init();
  }

  @Override
  protected void onDestroy() {
    super.onDestroy();
    if (mConnGatt != null) {
      if ((mStatus != BluetoothProfile.STATE_DISCONNECTING)
          && (mStatus != BluetoothProfile.STATE_DISCONNECTED)) {
        mConnGatt.disconnect();
      }
      mConnGatt.close();
      mConnGatt = null;
    }
  }

  @Override
  public void onClick(View v) {
    if (v.getId() == R.id.read_manufacturer_name_button) {
      if ((v.getTag() != null)
          && (v.getTag() instanceof BluetoothGattCharacteristic)) {
        BluetoothGattCharacteristic ch = (BluetoothGattCharacteristic) v
            .getTag();
        if (mConnGatt.readCharacteristic(ch)) {
          setProgressBarIndeterminateVisibility(true);
        }
      }
    } else if (v.getId() == R.id.read_serial_number_button) {
      if ((v.getTag() != null)
          && (v.getTag() instanceof BluetoothGattCharacteristic)) {
        BluetoothGattCharacteristic ch = (BluetoothGattCharacteristic) v
            .getTag();
        if (mConnGatt.readCharacteristic(ch)) {
          setProgressBarIndeterminateVisibility(true);
        }
      }

    } else if (v.getId() == R.id.write_alert_level_button) {
      if ((v.getTag() != null)
          && (v.getTag() instanceof BluetoothGattCharacteristic)) {
        BluetoothGattCharacteristic ch = (BluetoothGattCharacteristic) v
            .getTag();
        ch.setValue(new byte[] { (byte) 0x03 });
        if (mConnGatt.writeCharacteristic(ch)) {
          setProgressBarIndeterminateVisibility(true);
        }
      }
    }
  }

  private void init() {
    // BLE check
    if (!BleUtil.isBLESupported(this)) {
      Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT)
          .show();
      finish();
      return;
    }

    // BT check
    BluetoothManager manager = BleUtil.getManager(this);
    if (manager != null) {
      mBTAdapter = manager.getAdapter();
    }
    if (mBTAdapter == null) {
      Toast.makeText(this, R.string.bt_unavailable, Toast.LENGTH_SHORT)
          .show();
      finish();
      return;
    }

    // check BluetoothDevice
    if (mDevice == null) {
      mDevice = getBTDeviceExtra();
      if (mDevice == null) {
        finish();
        return;
      }
    }

    // button disable
    mReadManufacturerNameButton.setEnabled(false);
    mReadSerialNumberButton.setEnabled(false);
    mWriteAlertLevelButton.setEnabled(false);

    // connect to Gatt
    if ((mConnGatt == null)
        && (mStatus == BluetoothProfile.STATE_DISCONNECTED)) {
      // try to connect
      mConnGatt = mDevice.connectGatt(this, false, mGattcallback);
      mStatus = BluetoothProfile.STATE_CONNECTING;
    } else {
      if (mConnGatt != null) {
        // re-connect and re-discover Services
        mConnGatt.connect();
        mConnGatt.discoverServices();
      } else {
        Log.e(TAG, "state error");
        finish();
        return;
      }
    }
    setProgressBarIndeterminateVisibility(true);
  }

  private BluetoothDevice getBTDeviceExtra() {
    Intent intent = getIntent();
    if (intent == null) {
      return null;
    }

    Bundle extras = intent.getExtras();
    if (extras == null) {
      return null;
    }

    return extras.getParcelable(EXTRA_BLUETOOTH_DEVICE);
  }

}




Java Source Code List

youten.redo.ble.readwrite.DeviceActivity.java
youten.redo.ble.readwrite.DeviceAdapter.java
youten.redo.ble.readwrite.ScanActivity.java
youten.redo.ble.util.BleUtil.java
youten.redo.ble.util.BleUuid.java
youten.redo.ble.util.ScannedDevice.java