0

Below is main activity code where I got text from service throug broadcast and I'd like to forward this text to server using wifi.

I was thinking that I can just register this app as client and send text to another phone where server app is installed. But I'm not sure how to do that. It should be done automatically without pushing any buttons.

Any ideas???

This code is put together from different examples, so sorry if it looks very rough but at least it works;)

I separated lines I added for TCP client:

//for socket client start

//for socket client end

Thanks!

Code

import android.app.Activity;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.SystemClock;
import android.text.Html;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;


public class MainActivity extends Activity {

public  ResponseReceiver receiver;
public  CountDownTimer countDownTimer;

//for socket client start
private Socket socket;
private static final int SERVERPORT = 6000;
private static final String SERVER_IP = "192.168.0.106";
//for socket client end


final BroadcastReceiver mReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
            //Do something if connected
            Toast.makeText(getApplicationContext(), "SINIHAMMAS OLEMAS", Toast.LENGTH_SHORT).show();
            SystemClock.sleep(3000);
            Intent i = getBaseContext().getPackageManager()
                    .getLaunchIntentForPackage( getBaseContext().getPackageName() );
            i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(i);
            countDownTimer.cancel();
        }
        else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
            Toast.makeText(getApplicationContext(), "SINIHAMMAS LAHTI", Toast.LENGTH_SHORT).show();

            countDownTimer.start();

        }//else if...
    }//onReceive
};//BroadcastReceiver

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    long startTime = 30000;
    long interval = 1000;
    countDownTimer = new MyCountDownTimer(startTime, interval);

    IntentFilter filter1 = new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED);
    IntentFilter filter2 = new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED);
    IntentFilter filter3 = new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECTED);
    this.registerReceiver(mReceiver, filter1);
    this.registerReceiver(mReceiver, filter2);
    this.registerReceiver(mReceiver, filter3);

    final AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

//for socket client start
    new Thread(new ClientThread()).start();
//for socket client end

    registerReceiver(new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            int state = intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -1);
            Log.d("sinihammas", "Audio SCO state: " + state);

            if (AudioManager.SCO_AUDIO_STATE_CONNECTED == state) {

                unregisterReceiver(this);
            }//if

        }//onRecieve
    }, new IntentFilter(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED));//registerReciever

    Log.d("sinihammas", "starting bluetooth");
    am.startBluetoothSco();

    SystemClock.sleep(2000);


            Intent msgIntent = new Intent(MainActivity.this, SimpleIntentService.class);
            startService(msgIntent);

            final Button button = (Button) findViewById(R.id.button);
            button.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    am.setBluetoothScoOn(false);
                    am.stopBluetoothSco();
                    System.exit(0);
                }
            });

            IntentFilter filter = new IntentFilter(ResponseReceiver.ACTION_RESP);
            filter.addCategory(Intent.CATEGORY_DEFAULT);
            receiver = new ResponseReceiver();
            registerReceiver(receiver, filter);


        }//onCreate

        public class ResponseReceiver extends BroadcastReceiver {
            public static final String ACTION_RESP = "alar.alar.com.rahelividinakes2.MESSAGE_PROCESSED";

            @Override
            public void onReceive(Context context, Intent intent) {
                TextView result = (TextView) findViewById(R.id.textView);
                String text = intent.getStringExtra(SimpleIntentService.PARAM_OUT_MSG);
                result.setText(Html.fromHtml(text + "<br>" + result.getText()));


**I THINK I SHOULD SEND TEXT HERE, BUT I DONT KNOW HOW**


            }//onReceive

        }//BroadcastReceiver

public class MyCountDownTimer extends CountDownTimer {
    MediaPlayer mediaPlayer = MediaPlayer.create(alar.alar.com.rahelividinakes2.MainActivity.this, R.raw.haire);


    public MyCountDownTimer(long startTime, long interval) {
        super(startTime, interval);
    }

    @Override
    public void onFinish() {
        mediaPlayer.start();
        SystemClock.sleep(7000);
        mediaPlayer.release();

    }

    @Override
    public void onTick(long millisUntilFinished) {

    }


}

//for socket client start
class ClientThread implements Runnable {

    @Override
    public void run() {

        try {
            InetAddress serverAddr = InetAddress.getByName(SERVER_IP);

            socket = new Socket(serverAddr, SERVERPORT);

        } catch (UnknownHostException e1){
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }
}
//for socket client end

    }//Activity

server code EDITED

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;


public class MainActivity extends Activity {

private ServerSocket serverSocket;

Handler updateConversationHandler;

Thread serverThread = null;

private TextView text;

public static final int SERVERPORT = 6000;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    text = (TextView) findViewById(R.id.text2);

    updateConversationHandler = new Handler();

    this.serverThread = new Thread(new ServerThread());
    this.serverThread.start();

}

@Override
protected void onStop() {
    super.onStop();
    try {
        serverSocket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

class ServerThread implements Runnable {

    public void run() {
        Socket socket = null;
        try {
            serverSocket = new ServerSocket(SERVERPORT);
        } catch (IOException e) {
            e.printStackTrace();
        }

        while (!Thread.currentThread().isInterrupted()) {
            try {
                socket = serverSocket.accept();
                CommunicationThread commThread = new CommunicationThread(socket);
                new Thread(commThread).start();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

class CommunicationThread implements Runnable {

    private Socket clientSocket;
    private BufferedReader input;

    public CommunicationThread(Socket clientSocket) {

        this.clientSocket = clientSocket;

        try {
            this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void run() {

        while (!Thread.currentThread().isInterrupted()) {

            try {
                String read = input.readLine();
                updateConversationHandler.post(new updateUIThread(read));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

class updateUIThread implements Runnable {

    private String msg;

    public updateUIThread(String str) {
        this.msg = str;
    }

    @Override
    public  void run() {
        text.setText(text.getText().toString()+"Client Says: "+ msg + "\n");
    }
}
}

1 Answer 1

1

First of all, SystemClock.sleep() in MainActivity.onCreate() is a really bad idea due to possible ANR.

Your question actually contains 2 subquestions:

  1. How to send our data to the client thread?

Add a queue member to the activity class. We'll use it in our client thread.

    //for socket client start
    private Socket socket;
    private static final int SERVERPORT = 6000;
    private static final String SERVER_IP = "192.168.0.106";
    private ConcurrentLinkedQueue<String> mSendQueue = new ConcurrentLinkedQueue<String>();
    //for socket client end

And make ResponseReceiver to add data to a queue.

    public class ResponseReceiver extends BroadcastReceiver {
        public static final String ACTION_RESP = "alar.alar.com.rahelividinakes2.MESSAGE_PROCESSED";

        @Override
        public void onReceive(Context context, Intent intent) {
            TextView result = (TextView) findViewById(R.id.textView);
            String text = intent.getStringExtra(SimpleIntentService.PARAM_OUT_MSG);
            result.setText(Html.fromHtml(text + "<br>" + result.getText()));

            MainActivity.this.mSendQueue.add(text);

        }//onReceive

    }//BroadcastReceiver
  1. How to send our data via the socket?

Use a queue in ClientThread

    class ClientThread implements Runnable {

        private final ConcurrentLinkedQueue<String> mQueue;

        public ClientThread(ConcurrentLinkedQueue<String> queue) {
            mQueue = queue;
        }

    @Override
    public void run() {

    try {
        InetAddress serverAddr = InetAddress.getByName(SERVER_IP);

        socket = new Socket(serverAddr, SERVERPORT);

        OutputStream stream = socket.getOutputStream();

        while(true) {
            String data = mQueue.poll();
            if(data == null) {
                //queue is empty, waiting...
                SystemClock.sleep(100);
                continue;
            }

            byte[] bytes = data.getBytes();
            stream.write(bytes, 0, bytes.length);
            stream.flush();
        }

    } catch (UnknownHostException e1){
        e1.printStackTrace();
    } catch (IOException e1) {
        e1.printStackTrace();
    } finally {
        //free resources
    }
}
}
//for socket client end
Sign up to request clarification or add additional context in comments.

2 Comments

Thanks for pointing to ANR thing. I was thinking that as there is no possible input from user (user can only see the service messages) and service sends messages about every 15 minutes then it's not the issue, but I will try to get rid of these. When I use your suggested code it's gives error that: ClientThread(ConcurrentLinkedQueue<String>) in ClientThread cannot be applied to ()
I forgot to say that mSendQueue should be use as argument while creating ClientThread. I.e. new Thread(new ClientThread(mSendQueue)).start();

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.