Maurício Vilarinho Maurício Vilarinho - 3 months ago 37
Android Question

Android - Receving an Image over the Socket from C# Server (Almost Complete)

I'm sending an image (it's basically a video stream) x times per second on my server.

master.frame_drone.Bitmap
is the image

C# Server

private void send_data()
{

string data = "";


string conetado, bateria, tensao, altitude, roll, pitch, yaw, velx, vely, velz, estado, atual, desejado;
string conetado2, bateria2, tensao2, altitude2, roll2, pitch2, yaw2, velx2, vely2, velz2, estado2, atual2, desejado2;

conetado = master.sconetado;
bateria = master.sbateria;
tensao = master.stensao;
altitude = master.saltitude;
roll = master.sroll;
pitch = master.spitch;
yaw = master.syaw;
velx = master.svelx;
vely = master.svely;
velz = master.svelz;
estado = master.sestado;
atual = master.satual;
desejado = master.sdesejado;


conetado2 = slave.sconetado;
bateria2 = slave.sbateria;
tensao2 = slave.stensao;
altitude2 = slave.saltitude;
roll2 = slave.sroll;
pitch2 = slave.spitch;
yaw2 = slave.syaw;
velx2 = slave.svelx;
vely2 = slave.svely;
velz2 = slave.svelz;
estado2 = slave.sestado;
atual2 = slave.satual;
desejado2 = slave.sdesejado;


ImageConverter converter = new ImageConverter();
byte[] sendBytes = (byte[])converter.ConvertTo(master.frame_drone.Bitmap, typeof(byte[]));

string_master_frame = Convert.ToBase64String(sendBytes);

data = conetado + "\n" + bateria + "\n" + tensao + "\n" + altitude + "\n" + roll + "\n" + pitch + "\n" + yaw + "\n" + velx + "\n" + vely + "\n" + velz + "\n" + estado + "\n" + atual + "\n" + desejado + "\n" +
conetado2 + "\n" + bateria2 + "\n" + tensao2 + "\n" + altitude2 + "\n" + roll2 + "\n" + pitch2 + "\n" + yaw2 + "\n" + velx2 + "\n" + vely2 + "\n" + velz2 + "\n" + estado2 + "\n" + atual2 + "\n" + desejado2 + "\n" + string_master_frame + "\n";

tcpServer1.Send(data);


}


So I get a string from the server that it's basically the image.

Android Client

protected Void doInBackground(Void... arg0) {


Socket socket = null;

try {
socket = new Socket(dstAddress, dstPort);

while(true) {
Scanner r = new Scanner(new InputStreamReader(socket.getInputStream()));

/*
* notice: inputStream.read() will block if no data return
*/
//MASTER
valores[0] = r.nextLine();
valores[1] = r.nextLine();
valores[2] = r.nextLine();
valores[3] = r.nextLine();
valores[4] = r.nextLine();
valores[5] = r.nextLine();
valores[6] = r.nextLine();
valores[7] = r.nextLine();
valores[8] = r.nextLine();
valores[9] = r.nextLine();
valores[10] = r.nextLine();
valores[11] = r.nextLine();
valores[12] = r.nextLine();

//SLAVE
valores[13] = r.nextLine();
valores[14] = r.nextLine();
valores[15] = r.nextLine();
valores[16] = r.nextLine();
valores[17] = r.nextLine();
valores[18] = r.nextLine();
valores[19] = r.nextLine();
valores[20] = r.nextLine();
valores[21] = r.nextLine();
valores[22] = r.nextLine();
valores[23] = r.nextLine();
valores[24] = r.nextLine();
valores[25] = r.nextLine();

valores[26] = r.nextLine();


publishProgress(valores[0],valores[1],valores[2],valores[3],valores[4],valores[5],valores[6],valores[7],valores[8],valores[9],valores[10],valores[11],valores[12],
valores[13],valores[14],valores[15],valores[16],valores[17],valores[18],valores[19],valores[20],valores[21],valores[22],valores[23],valores[24],valores[25],valores[26]);
}

@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
conetado.setText(values[0]);
bateria.setText(values[1]);
tensao.setText(values[2]);
altitude.setText(values[3]);
roll.setText(values[4]);
pitch.setText(values[5]);
yaw.setText(values[6]);
velx.setText(values[7]);
vely.setText(values[8]);
velz.setText(values[9]);
estado.setText(values[10]);
atual.setText(values[11]);
desejado.setText(values[12]);

conetado2.setText(values[13]);
bateria2.setText(values[14]);
tensao2.setText(values[15]);
altitude2.setText(values[16]);
roll2.setText(values[17]);
pitch2.setText(values[18]);
yaw2.setText(values[19]);
velx2.setText(values[20]);
vely2.setText(values[21]);
velz2.setText(values[22]);
estado2.setText(values[23]);
atual2.setText(values[24]);
desejado2.setText(values[25]);

Bitmap master_bitmap = BitmapFactory.decodeByteArray(values[26].getBytes(),0,values[26].length());
master_frame.setImageBitmap(master_bitmap);

}


}

My problem is that I read the strings line by line using
\n
all the
TextViews
were working well but when I introduce the string
valores[26]
everything starts desyncronizing and all the values get mixed, for example:
valores[0]
now gets some of the data of
valores[26]
, etc...

How can I get the string from the server and display it on a
ImageView
?

EDIT:

Scanner r = new Scanner(new InputStreamReader(socket.getInputStream()));
while(true) {


Worked. Now the data doesnt mix. One last question:

Inside my onProgressUpdate i tried to decode the string and didnt work.

byte[] decodedString = Base64.decode(values[26],Base64.DEFAULT);
Bitmap master_bitmap = BitmapFactory.decodeByteArray(decodedString,0,decodedString.length);
master_frame.setImageBitmap(master_bitmap);



Process: com.example.tiago.java_android, PID: 3510
java.lang.IllegalArgumentException: bad base-64
at android.util.Base64.decode(Base64.java:161)
at android.util.Base64.decode(Base64.java:136)
at android.util.Base64.decode(Base64.java:118)

Answer
     while(true) {
            Scanner r = new Scanner(new InputStreamReader(socket.getInputStream()));

Change that to:

    Scanner r = new Scanner(new InputStreamReader(socket.getInputStream()));

    while(true) {
Comments