RegularNormalDayGuy
RegularNormalDayGuy

Reputation: 735

Reading Bluetooth data and putting it to MainActivity

I've been looking for this for a while and everything I've tried has not worked yet. I implemented a Bluetooth connection service class that let's me connect and send messages via Bluetooth to a HC-05 module. I'm able to see each message within the console (with a Log), however, no matter what I tried, I can't seem to put the bytes received into my main activity where I can treat it. Here is the code I have in the BluetoothConnectionService class where my Log is located:

BluetoothConnectionService:

private Handler mHandler; // handler that gets info from Bluetooth service

// Defines several constants used when transmitting messages between the
// service and the UI.
private interface MessageConstants {
    public static final int MESSAGE_READ = 0;
    public static final int MESSAGE_WRITE = 1;
    public static final int MESSAGE_TOAST = 2;

    // ... (Add other message types here as needed.)
}    

public void run(){
            byte[] buffer = new byte[1024];  // buffer store for the stream
            int bytes; // bytes returned from read()

            // Keep listening to the InputStream until an exception occurs
            while (true) {
                // Read from the InputStream
                try {
                    bytes = mmInStream.read(buffer);
                    String incomingMessage = new String(buffer, 0, bytes);
                    Log.d(TAG, "InputStream: " + incomingMessage);

                    // Send the obtained bytes to the MainActivity
                    Handler mainActivityHandler = new Handler();
                    mainActivityHandler.obtainMessage(MessageConstants.MESSAGE_READ, bytes, -1, buffer);

                    // Send the obtained bytes to the UI activity.
                    /*Message readMsg = mHandler.obtainMessage(
                            MessageConstants.MESSAGE_READ, bytes, -1,
                            buffer);
                    readMsg.sendToTarget();*/
                } catch (IOException e) {
                    Log.e(TAG, "write: Error reading Input Stream. " + e.getMessage() );
                    break;
                }
            }
        }

MainActivity: (in the onCreate)

btnReadGlucose.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //On va envoyer quelle personne il faut lire le data
                String patientName = mSpinner.getSelectedItem().toString();
                int patientPosition = mSpinner.getSelectedItemPosition();
                Log.d(TAG, "Le patient " + patientName + " a la position " + patientPosition + " est selectionne");

                //Trouver quelle lettre envoyer
                DataEnvoyer = mappingPatients(patientPosition);
                RequestData = true;

                //Envoi du data
                envoyerCommandeBluetooth(DataEnvoyer);

                //How do I call my handler ?

            }
        });

I'm still a newbie with Bluetooth communication handlers. I think I'm close to the answer but I really don't know how to get the message in the byte and save it to a value in my main activity.

Can anyone help ?

Thanks, luisarcher.

Upvotes: 0

Views: 513

Answers (1)

udit7395
udit7395

Reputation: 626

METHOD 1 : If this service running on the same thread as the activity then bind the service with activity.

//IN YOUR ACTIVITY 
startService(new Intent(getApplicationContext(), BluetoothService.class));
bindService(new Intent(getApplicationContext(), BluetoothService.class), mServiceConnection, Context.BIND_AUTO_CREATE);


private ServiceConnection mServiceConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
        BluetoothService.BackgroundBinder backgroundBinder = (BluetoothService.BackgroundBinder) iBinder;
        mBackgroundService = backgroundBinder.getBackgroundService();
        startPinging();
}

    @Override
    public void onServiceDisconnected(ComponentName componentName) {
        mBackgroundService = null;
        }
};

//IN SERVICE
public class BluetoothBinder extends Binder {
    public BluetoothService getBluetoothService() {
        return BluetoothService.this;
    }
}

@Override
public IBinder onBind(Intent intent) {
    Log.d(TAG, "Inside onBind");
    return new BluetoothBinder();
}

Now that the service is binded you can declare a getter in service for incomingMessage so when you press the button in activity it returns you the message.

METHOD 2(VIA HANDLER):if you need an interface to communicate across processes you can create a Messenger. It handles communication on single thread. I haven't done this but a good post about this can be found here.

METHOD 3(VIA LocalBroadCast): In your bluetooth service send a localBroadcast whenever you receive a message

//SERVICE
private void sendMessage(String incomingMessage) {
    Intent intent = new Intent("UNIQUE_ACTION");
    intent.putExtra("incomingMessage", incomingMessage);
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}

public void run(){
            byte[] buffer = new byte[1024];  // buffer store for the stream
            int bytes; // bytes returned from read()

            // Keep listening to the InputStream until an exception occurs
            while (true) {
                // Read from the InputStream
                try {
                    bytes = mmInStream.read(buffer);
                    String incomingMessage = new String(buffer, 0, bytes);
                    Log.d(TAG, "InputStream: " + incomingMessage);
                    sendMessage(incomingMessage);

//ACTIVITY
@Override
public void onResume() {
    super.onResume();
    // This registers mMessageReceiver to receive messages.
    LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,new IntentFilter("UNIQUE_ACTION"));
}

// Handling the received Intents for the "UNIQUE_ACTION" event 
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
    // Extract data included in the Intent
    String incomingMessage = intent.getStringExtra()("incomingMessage");
    Log.d(TAG, incomingMessage);
    }
};

@Override
protected void onPause() {
    // Unregister since the activity is not visible
    LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
    super.onPause();
}

Also, I would suggest looking at this link for communication between service and activity.

P.S:Have a look at this library for bluetooth communication.It does provide methods to get data from Bluetooth and I have personally tested that it works with HC-05 and also has examples.

Upvotes: 1

Related Questions