Java Code Examples for android.bluetooth.BluetoothGatt#STATE_CONNECTED

The following examples show how to use android.bluetooth.BluetoothGatt#STATE_CONNECTED . You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: MainActivity.java    From BTLETest with MIT License 6 votes vote down vote up
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
    super.onConnectionStateChange(gatt, status, newState);
    if (newState == BluetoothGatt.STATE_CONNECTED) {
        writeLine("Connected!");
        // Discover services.
        if (!gatt.discoverServices()) {
            writeLine("Failed to start discovering services!");
        }
    }
    else if (newState == BluetoothGatt.STATE_DISCONNECTED) {
        writeLine("Disconnected!");
    }
    else {
        writeLine("Connection state changed.  New state: " + newState);
    }
}
 
Example 2
Source File: BLeSerialPortService.java    From Android-BLE-Terminal with MIT License 6 votes vote down vote up
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
    super.onConnectionStateChange(gatt, status, newState);
    if (newState == BluetoothGatt.STATE_CONNECTED) {
        if (status == BluetoothGatt.GATT_SUCCESS) {
            // Connected to device, start discovering services.
            if (!gatt.discoverServices()) {
                // Error starting service discovery.
                connectFailure();
            }
        } else {
            // Error connecting to device.
            connectFailure();
        }
    } else if (newState == BluetoothGatt.STATE_DISCONNECTED) {
        // Disconnected, notify callbacks of disconnection.
        rx = null;
        tx = null;
        notifyOnDisconnected(context);
    }
}
 
Example 3
Source File: EddystoneGattServer.java    From beacons-android with Apache License 2.0 6 votes vote down vote up
@Override
public void onConnectionStateChange(BluetoothDevice device, int status, int newState) {
    super.onConnectionStateChange(device, status, newState);

    if (newState == BluetoothGatt.STATE_DISCONNECTED) {
        log(device + " has disconnected");
        if (device.equals(mEddystoneGattService.getConnectedOwner())) {
            log("Owner disconnected, stopping GATT server");
            mEddystoneGattService.onOwnerDisconnected();
            close();
        }
    }
    else if (newState == BluetoothGatt.STATE_CONNECTED) {
        log(device + " has connected");
        if (mEddystoneGattService.getConnectedOwner() != null) {
            // don't allow a second client to connect at the same time
            log(device + " tried to connect, but owner is active. Disconnecting.");
            mGattServer.cancelConnection(device);
        }
    }
}
 
Example 4
Source File: BluetoothLeUart.java    From Adafruit_Android_BLE_UART with MIT License 6 votes vote down vote up
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
    super.onConnectionStateChange(gatt, status, newState);
    if (newState == BluetoothGatt.STATE_CONNECTED) {
        if (status == BluetoothGatt.GATT_SUCCESS) {
            // Connected to device, start discovering services.
            if (!gatt.discoverServices()) {
                // Error starting service discovery.
                connectFailure();
            }
        }
        else {
            // Error connecting to device.
            connectFailure();
        }
    }
    else if (newState == BluetoothGatt.STATE_DISCONNECTED) {
        // Disconnected, notify callbacks of disconnection.
        rx = null;
        tx = null;
        notifyOnDisconnected(this);
    }
}
 
Example 5
Source File: DeviceMirror.java    From BLE with Apache License 2.0 6 votes vote down vote up
/**
 * 连接状态改变,主要用来分析设备的连接与断开
 * @param gatt GATT
 * @param status 改变前状态
 * @param newState 改变后状态
 */
@Override
public void onConnectionStateChange(final BluetoothGatt gatt, final int status, final int newState) {
    ViseLog.i("onConnectionStateChange  status: " + status + " ,newState: " + newState +
            "  ,thread: " + Thread.currentThread());
    if (newState == BluetoothGatt.STATE_CONNECTED) {
        gatt.discoverServices();
    } else if (newState == BluetoothGatt.STATE_DISCONNECTED) {
        close();
        if (connectCallback != null) {
            if (handler != null) {
                handler.removeCallbacksAndMessages(null);
            }
            ViseBle.getInstance().getDeviceMirrorPool().removeDeviceMirror(deviceMirror);
            if (status == BluetoothGatt.GATT_SUCCESS) {
                connectState = ConnectState.CONNECT_DISCONNECT;
                connectCallback.onDisconnect(isActiveDisconnect);
            } else {
                connectState = ConnectState.CONNECT_FAILURE;
                connectCallback.onConnectFailure(new ConnectException(gatt, status));
            }
        }
    } else if (newState == BluetoothGatt.STATE_CONNECTING) {
        connectState = ConnectState.CONNECT_PROCESS;
    }
}
 
Example 6
Source File: MainActivity.java    From SensorTag-CC2650 with Apache License 2.0 6 votes vote down vote up
void onConnect() {
	if (mNumDevs > 0) {

		int connState = mBluetoothManager.getConnectionState(mBluetoothDevice,
		    BluetoothGatt.GATT);

		switch (connState) {
		case BluetoothGatt.STATE_CONNECTED:
			mBluetoothLeService.disconnect(null);
			break;
		case BluetoothGatt.STATE_DISCONNECTED:
			boolean ok = mBluetoothLeService.connect(mBluetoothDevice.getAddress());
			if (!ok) {
				setError("Connect failed");
			}
			break;
		default:
			setError("Device busy (connecting/disconnecting)");
			break;
		}
	}
}
 
Example 7
Source File: OperationImpl.java    From neatle with MIT License 6 votes vote down vote up
@Override
@SuppressWarnings("PMD.CompareObjectsWithEquals")
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
    NeatleLogger.i("OperationImpl: onConnectionStateChange, state:" + status + ", newState: " + newState);

    Command cur;
    synchronized (OperationImpl.this) {
        cur = currentCommand;
        if (newState != BluetoothGatt.STATE_CONNECTED && cur == EMPTY_COMMAND &&
                (lastResult == null || lastResult.wasSuccessful())) {
            lastResult = CommandResult.createErrorResult(null, BluetoothGatt.GATT_FAILURE);
            scheduleNext();
            return;
        }
    }
    cur.onConnectionStateChange(gatt, status, newState);
}
 
Example 8
Source File: Device.java    From neatle with MIT License 5 votes vote down vote up
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
    boolean didConnect = false;
    NeatleLogger.d("onConnectionStateChange status: " + status + " newState:" + newState);
    if (newState == BluetoothGatt.STATE_CONNECTED && status == BluetoothGatt.GATT_SUCCESS) {
        didConnect = gatt.discoverServices();
    }

    if (!didConnect) {
        gatt.close();
        connectionFailed(status);
    } else {
        connectionSuccess();
    }
}
 
Example 9
Source File: P_NativeDeviceWrapper.java    From SweetBlue with GNU General Public License v3.0 5 votes vote down vote up
boolean isNativelyConnected()
{
	synchronized (this)
	{
		return getConnectionState() == BluetoothGatt.STATE_CONNECTED;
	}
}
 
Example 10
Source File: P_NativeDeviceWrapper.java    From AsteroidOSSync with GNU General Public License v3.0 5 votes vote down vote up
boolean isNativelyConnected()
{
	synchronized (this)
	{
		return getConnectionState() == BluetoothGatt.STATE_CONNECTED;
	}
}
 
Example 11
Source File: MainActivity.java    From NewXmPluginSDK with Apache License 2.0 5 votes vote down vote up
@Override
public void onConnectionStateChange(BluetoothDevice device, int status, int newState) throws RemoteException {
    BluetoothLog.v(String.format("%s.onConnectionStateChange: status = %d, newState = %d", TAG, status, newState));

    if (newState == BluetoothGatt.STATE_CONNECTED) {
        mHandler.sendEmptyMessageDelayed(0, NOTIFY_CYCLE);
    } else if (newState == BluetoothGatt.STATE_DISCONNECTED) {
    }
}
 
Example 12
Source File: SelectDeviceDialog.java    From EFRConnect-android with Apache License 2.0 5 votes vote down vote up
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
    super.onConnectionStateChange(gatt, status, newState);
    Timber.d("Connection State Change");
    Timber.d("Status: " + status);
    Timber.d("New State: " + newState);
    if (newState == BluetoothGatt.STATE_CONNECTED) {
        ((BaseActivity) getActivity()).dismissModalDialog();
        Intent intent = getIntent(connectType, getActivity());
        if (intent != null) {
            bluetoothBinding.unbind();
            startActivity(intent);
        }
    } else if (retryAttempts < MAX_RETRY_ATTEMPTS) {
        retryConnectionAttempt();
    } else {
        ((BaseActivity) getActivity()).dismissModalDialog();
        bluetoothBinding.unbind();
        getActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(getActivity(), "Connection Failed", Toast.LENGTH_SHORT).show();
            }
        });
        reDiscover(true);
    }
}
 
Example 13
Source File: GattClient.java    From bean-sdk-android with MIT License 5 votes vote down vote up
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {

    if (status != BluetoothGatt.GATT_SUCCESS) {
        if (getOADProfile().uploadInProgress()) {
            // Since an OAD update is currently in progress, only alert the OAD Profile
            // of the Bean disconnecting, not the ConnectionListener(s)
            getOADProfile().onBeanConnectionFailed();
        } else {
            connectionListener.onConnectionFailed();
        }

        mConnected = false;
        return;
    }

    if (newState == BluetoothGatt.STATE_CONNECTED) {
        mConnected = true;

        // Bean is connected, before alerting the ConnectionListener(s), we must
        // discover available services (lookup GATT table).
        Log.i(TAG, "Discovering Services!");
        mGatt.discoverServices();
    }

    if (newState == BluetoothGatt.STATE_DISCONNECTED) {
        mOperationsQueue.clear();
        mOperationInProgress = false;
        mConnected = false;
        connectionListener.onDisconnected();
        for (BaseProfile profile : mProfiles) {
            profile.onBeanDisconnected();
        }
    }
}
 
Example 14
Source File: Command.java    From neatle with MIT License 4 votes vote down vote up
protected void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
    if (status != BluetoothGatt.GATT_SUCCESS || newState != BluetoothGatt.STATE_CONNECTED) {
        onError(BluetoothGatt.GATT_FAILURE);
    }
}
 
Example 15
Source File: DfuBaseService.java    From microbit with Apache License 2.0 4 votes vote down vote up
@Override
        public void onConnectionStateChange(final BluetoothGatt gatt, final int status, final int newState) {
            // Check whether an error occurred
            logi("onConnectionStateChange() :: Start");
            if (status == BluetoothGatt.GATT_SUCCESS) {
                if (newState == BluetoothGatt.STATE_CONNECTED) {
                    logi("onConnectionStateChange() :: Connected to GATT server");
                    mConnectionState = STATE_CONNECTED;

					/*
                     *  The onConnectionStateChange callback is called just after establishing connection and before sending Encryption Request BLE event in case of a paired device.
					 *  In that case and when the Service Changed CCCD is enabled we will get the indication after initializing the encryption, about 1600 milliseconds later. 
					 *  If we discover services right after connecting, the onServicesDiscovered callback will be called immediately, before receiving the indication and the following 
					 *  service discovery and we may end up with old, application's services instead.
					 *  
					 *  This is to support the buttonless switch from application to bootloader mode where the DFU bootloader notifies the master about service change.
					 *  Tested on Nexus 4 (Android 4.4.4 and 5), Nexus 5 (Android 5), Samsung Note 2 (Android 4.4.2). The time after connection to end of service discovery is about 1.6s 
					 *  on Samsung Note 2.
					 *  
					 *  NOTE: We are doing this to avoid the hack with calling the hidden gatt.refresh() method, at least for bonded devices.
					 */
                    if (gatt.getDevice().getBondState() == BluetoothDevice.BOND_BONDED) {
                        try {
                            synchronized (this) {
                                logd("onConnectionStateChange() :: Waiting 1600 ms for a possible Service Changed indication...");
                                wait(1600);

                                // After 1.6s the services are already discovered so the following gatt.discoverServices() finishes almost immediately.

                                // NOTE: This also works with shorted waiting time. The gatt.discoverServices() must be called after the indication is received which is
                                // about 600ms after establishing connection. Values 600 - 1600ms should be OK.
                            }
                        } catch (InterruptedException e) {
                            Log.e(TAG, e.toString());
                            // Do nothing
                        }
                    }

                    // Attempts to discover services after successful connection.
                    final boolean success = gatt.discoverServices();
                    logi("onConnectionStateChange() :: Attempting to start service discovery... " + (success ? "succeed" : "failed"));

                    if (!success) {
                        mError = ERROR_SERVICE_DISCOVERY_NOT_STARTED;
                    } else {
                        // Just return here, lock will be notified when service discovery finishes
                        return;
                    }
                } else if (newState == BluetoothGatt.STATE_DISCONNECTED) {
                    logi("onConnectionStateChange() :: Disconnected from GATT server");
                    mPaused = false;
                    mConnectionState = STATE_DISCONNECTED;
                }
            } else {
                loge("Connection state change error: " + status + " newState: " + newState);
/*				if (newState == BluetoothGatt.STATE_DISCONNECTED) {
                    mConnectionState = STATE_DISCONNECTED;
                    if (mServicePhase == PAIRING_REQUEST ){
                        mServicePhase = PAIRING_FAILED ;
                        updateProgressNotification(status);
                    }
                }*/
                mPaused = false;
                mError = ERROR_CONNECTION_STATE_MASK | status;
            }

            // Notify waiting thread
            synchronized (mLock) {
                mLock.notifyAll();
            }
        }
 
Example 16
Source File: P_NativeDeviceWrapper.java    From SweetBlue with GNU General Public License v3.0 4 votes vote down vote up
boolean isNativelyConnectingOrConnected()
{
	int state = getConnectionState();
	return state == BluetoothGatt.STATE_CONNECTED || state == BluetoothGatt.STATE_CONNECTING;
}
 
Example 17
Source File: P_NativeDeviceWrapper.java    From AsteroidOSSync with GNU General Public License v3.0 4 votes vote down vote up
boolean isNativelyConnectingOrConnected()
{
	int state = getConnectionState();
	return state == BluetoothGatt.STATE_CONNECTED || state == BluetoothGatt.STATE_CONNECTING;
}
 
Example 18
Source File: Device.java    From neatle with MIT License 4 votes vote down vote up
public boolean areServicesDiscovered() {
    synchronized (lock) {
        return serviceDiscovered && state == BluetoothGatt.STATE_CONNECTED;
    }
}
 
Example 19
Source File: Node.java    From BlueSTSDK_Android with BSD 3-Clause "New" or "Revised" License 4 votes vote down vote up
/**
 * if we are connecting it start to scan the device service/characteristics otherwise it
 * change the node status to idle or unreachable.
 * if there is an error the node status go to dead
 * @param gatt connection with the device
 * @param status command status
 * @param newState new node status
 */
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState){
    Log.d(TAG,"Node: "+Node.this.getName()+" Status: "+status+" newState: " +
            ""+newState+" boundState:"+mDevice.getBondState());
    if(status==BluetoothGatt.GATT_SUCCESS){
        if(newState==BluetoothGatt.STATE_CONNECTED){
                if (!isPairing()) { //if it is pairing we do it when it finish
                    //wait a bit for see if we will do the secure pairing or not,
                    //if the device will be in pair status the scan is aborted and will be
                    //done when the pairing will be completed
                    mBleThread.postDelayed(mScanServicesTask, RETRY_COMMAND_DELAY_MS);
                }//if !pairing
        }else if (newState == BluetoothGatt.STATE_DISCONNECTED){
            //if the auto connect is on, avoid to close and free resources
            if(!mConnectionOption.enableAutoConnect()) {
                if (mConnection != null) {
                    if(mConnectionOption.resetCache())
                        refreshDeviceCache(mConnection);
                    if (mGattServer != null) {
                        mGattServer.disconnect();
                    }
                    mConnection.close();
                }//if
                cleanConnectionData();
            }
            if (mUserAskToDisconnect){
                //disconnect completed
                Node.this.updateNodeStatus(State.Idle);
            }else{
                //we disconnect but the user didn't ask it
                Node.this.updateNodeStatus(State.Unreachable);
            }//if else
        }//if-else
    }else{
        //https://stackoverflow.com/questions/33718807/forcefully-turning-off-ble-device-connected-to-android-app-fires-onconnectionsta
        if(status==8 && // 8 = link lost
                newState == BluetoothGatt.STATE_DISCONNECTED &&
                mConnectionOption.enableAutoConnect()){
            Node.this.updateNodeStatus(State.Unreachable);
            return;
        }
        //close & clean the dead connection
        if(mConnection!=null) {
            if (mGattServer != null) {
                mGattServer.disconnect();
            }
            mConnection.close();
        }//if
        cleanConnectionData();
        //notify to the user
        Node.this.updateNodeStatus(State.Dead);
    }//if status
}
 
Example 20
Source File: BleManager.java    From Android-nRF-Toolbox with BSD 3-Clause "New" or "Revised" License 4 votes vote down vote up
@Override
public final void onConnectionStateChange(final BluetoothGatt gatt, final int status, final int newState) {
	if (status == BluetoothGatt.GATT_SUCCESS && newState == BluetoothProfile.STATE_CONNECTED) {
		// Notify the parent activity/service
		connected = true;
		connectionState = BluetoothGatt.STATE_CONNECTED;
		callbacks.onDeviceConnected(gatt.getDevice());

		/*
		 * The onConnectionStateChange event is triggered just after the Android connects to a device.
		 * In case of bonded devices, the encryption is reestablished AFTER this callback is called.
		 * Moreover, when the device has Service Changed indication enabled, and the list of services has changed (e.g. using the DFU),
		 * the indication is received few hundred milliseconds later, depending on the connection interval.
		 * When received, Android will start performing a service discovery operation on its own, internally,
		 * and will NOT notify the app that services has changed.
		 *
		 * If the gatt.discoverServices() method would be invoked here with no delay, if would return cached services,
		 * as the SC indication wouldn't be received yet.
		 * Therefore we have to postpone the service discovery operation until we are (almost, as there is no such callback) sure,
		 * that it has been handled.
		 * TODO: Please calculate the proper delay that will work in your solution.
		 * It should be greater than the time from LLCP Feature Exchange to ATT Write for Service Change indication.
		 * If your device does not use Service Change indication (for example does not have DFU) the delay may be 0.
		 */
		final boolean bonded = gatt.getDevice().getBondState() == BluetoothDevice.BOND_BONDED;
		final int delay = bonded ? 1600 : 0; // around 1600 ms is required when connection interval is ~45ms.
		handler.postDelayed(() -> {
			// Some proximity tags (e.g. nRF PROXIMITY) initialize bonding automatically when connected.
			if (gatt.getDevice().getBondState() != BluetoothDevice.BOND_BONDING) {
				gatt.discoverServices();
			}
		}, delay);
	} else {
		if (newState == BluetoothProfile.STATE_DISCONNECTED) {
			operationInProgress = true; // no more calls are possible
			initQueue = null;
			taskQueue.clear();
			final boolean wasConnected = connected;
			// if (connected) { // Checking connected prevents from calling onDeviceDisconnected if connection attempt failed. This check is not necessary
				notifyDeviceDisconnected(gatt.getDevice()); // This sets the connected flag to false
			// }
			// Try to reconnect if the initial connection was lost because of a link loss or timeout, and shouldAutoConnect() returned true during connection attempt.
			// This time it will set the autoConnect flag to true (gatt.connect() forces autoConnect true)
			if (initialConnection) {
				connect(gatt.getDevice());
			}

			if (wasConnected || status == BluetoothGatt.GATT_SUCCESS)
				return;
		}

		// TODO Should the disconnect method be called or the connection is still valid? Does this ever happen?
		profile.onError(ERROR_CONNECTION_STATE_CHANGE, status);
	}
}