Abro este post porque estoy desesperado y no he recibido respuesta en 4 foros supuestamente activos de Android, uno de ellos http://stackoverflow.com/, en el que he preguntado dos veces.
Estoy desarrollando una aplicacion Cliente/Servidor en Android que realiza un acceso remoto a un pc mediante Sockets. He estado buscando informacion sobre como realizar un escritorio remoto y segun he leido la mayoria de las apps y programas que se dedican a ello realizan capturas de pantalla para simular la vista del escritorio remoto a tiempo real. Quise empezar por ahi y me puse a probar primero en Java desde un pc a otro con exito. Ahora estoy probandolo desde el movil al pc, pero tengo un problema, y es que al recibir las imagenes y colocarlas en un ImageView no se refresca salvo cuando termina la ejecucion del evento, que muestra la ultima captura tomada. A partir de aqui me gustaria preguntar dos cosas:
La primera es si alguien conoce una forma mejor (que las habra seguro) de establecer un escritorio remoto, tanto de Android como de Java, me gustaria aprender bien como manejarlo y adaptarme a cualquier sistema, ya que me parece un tema interesante.
La segunda pregunta esta relacionada con mi codigo, por si alguien sabe que falla.
Cliente
Código:
public class MainActivity extends Activity {
static Button boton;
static Button boton2;
static byte[] imagen;
static ImageView imagenVista;
//static Bitmap bmp;
static Socket clientSocket;
static OutputStream os;
static ObjectInputStream entrada;
@TargetApi(Build.VERSION_CODES.GINGERBREAD)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
boton = (Button)findViewById(R.id.button1);
boton.setOnClickListener(event);
imagenVista = (ImageView)findViewById(R.id.imageView1);
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
//boton.performClick();
}
private OnClickListener event = new OnClickListener() {
@TargetApi(Build.VERSION_CODES.GINGERBREAD)
@Override
public void onClick(View v) {
if (boton.getText().equals("Start")){
boton.setText("Stop");
try{
Toast.makeText(getApplicationContext(), "Pulsado", Toast.LENGTH_SHORT).show();
int cont = 0;
while(cont < 9) {
System.out.println("Creando socket cliente");
Socket clientSocket= new Socket();
System.out.println("Estableciendo la conexión");
InetSocketAddress addr=new InetSocketAddress("10.209.0.93", 5555);
clientSocket.connect(addr);
entrada = new ObjectInputStream(clientSocket.getInputStream());
final byte[] bytes_img;
bytes_img = (byte[]) entrada.readObject();
new Thread(new Runnable() {
@Override
public void run() {
final Bitmap bmp = BitmapFactory.decodeByteArray(bytes_img, 0, bytes_img.length);
imagenVista.post(new Runnable() {
//runOnUiThread(new Runnable() {
@Override
public void run() {
imagenVista.setImageBitmap(bmp);
imagenVista.invalidate();
}
});
}
}).start();
entrada.close();
clientSocket.close();
cont++;
}
}catch(Exception e){
e.printStackTrace();
}
}
else{
boton.setText("Start");
}
}
};
}
Servidor
Código:
public class Servidor implements Runnable, Serializable{
private static final long serialVersionUID = 8760160157002886283L;
static Socket newSocket;
static String msg;
static Boolean recibir = true;
static ServerSocket serverSocket;
public static void main(String args[]) throws IOException {
//serverSocket= new ServerSocket(5555);
char c = 20;
try{
System.out.println("\n" + InetAddress.getLocalHost().getHostName());
while(true){
serverSocket= new ServerSocket(5555);
System.out.println("Acepta conexiones");
newSocket= serverSocket.accept();
recibir = true;
Thread t1 = new Thread(new Servidor());
t1.start();
t1.join();
}
}catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void run() {
InputStream is;
OutputStream os;
System.out.println("Conexión recibida desde IP: " + newSocket.getInetAddress());
System.out.println("Nombre: " + Thread.currentThread().getName());
try{
ObjectOutputStream salida = new ObjectOutputStream(newSocket.getOutputStream());
salida.flush();
Rectangle dimension_pantalla = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
Robot robot = new Robot();
BufferedImage imgBuffer = robot.createScreenCapture(dimension_pantalla);
ByteArrayOutputStream salida_img = new ByteArrayOutputStream();
ImageIO.write(imgBuffer, "jpg", salida_img);
byte[] img_en_bytes = salida_img.toByteArray();
salida.writeObject(img_en_bytes);
salida.flush();
imgBuffer.flush();
salida.close();
newSocket.close();
serverSocket.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
(Si veis cosas que sobran es por las diversas pruebas que he ido haciendo con ambas clases )
Se trata de parte de mi proyecto de fin de curso, por lo que agradezco cualquier informacion que me sirva y estare eternamente agradecido a todo aquel que pueda ayudarme. Gracias! (Una vez lo termine subire el codigo)