Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [Java] InputStream per applicazione Android

    Ciao, sto cercando di realizzare lo streaming di una webcam remota.
    Il server gira sul PC a cui è connessa la webcam ed è scritto in Visual C# (anche il client per Windows).
    L'applicazione per Android è realizzata con Android Studio. Il mio problema è nella gestione della InputStream per ricevere l'immagine (in formato bytes) dal server.
    Posto il codice.

    codice:
    package com.example.skynet.streamremotewebcam;
    
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.ImageView;
    import android.widget.Toast;
    
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    
    public class MainActivity extends AppCompatActivity {
    
        // Variabili globali
    Socket client = null;
        String indIP = "";
        int porta = 0;
        String msg = "";
        byte[] messaggio;
        byte[] risposta;
    
        @Override
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            final EditText editText = (EditText) findViewById(R.id.editText);
            Button btn = (Button) findViewById(R.id.button);
            final ImageView image = (ImageView) findViewById(R.id.Image);
    
            btn.setOnClickListener(new View.OnClickListener() {
                @Override
    public void onClick(View v) {
                    while (true) {
                        indIP = editText.getText().toString();
                        porta = 11000;
                        msg = "1";
                        messaggio = msg.getBytes();
                        new Thread(new Runnable() {
                            @Override
    public void run() {
                                try {
                                    client = new Socket(indIP, porta);
    
                                    OutputStream out = client.getOutputStream();
                                    out.write(messaggio);
    
                                    InputStream in = client.getInputStream();
                                    int risp = in.read(risposta);
    
                                    Bitmap bmp = BitmapFactory.decodeByteArray(risposta, 0, risposta.length);
    
                                    image.setImageBitmap(bmp);
                                } catch (Exception ex) {
                                    Toast.makeText(MainActivity.this, "Si è verificato un errore ", Toast.LENGTH_LONG).show();
                                }
                            }
                        }).start();
                    }
                }
            });
        }
    }
    Quando lancio l'applicazione e premo sul tasto di connessione, il server riceve la richiesta ed invia l'immagine, ma l'applicazione Android si chiude senza dare errore. Potete aiutarmi? Grazie!

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Fatto così non va bene (però non credo che l'App si chiuda senza dare errori... verifica bene il LogCat perchè almeno un'eccezione ce l'hai).
    Tu stai creando "correttamente" un thread a parte per la comunicazione col server (ho scritto "correttamente" tra virgolette, il motivo lo spiego nel punto 2 più avanti)... ma gli errori sono almeno 2:

    1) Stai passando al metodo read() di InputStream l'array "risposta" che è nullo (e questo scatena sicuramente una NullPointerException che va a finire sul LogCat e fa schiantare l'applicazione): non lo hai inizializzato da nessuna parte, lo hai solo dichiarato all'inizio come variabile globale. Quello che va fatto è questo:
    - Devi istanziare (quindi dimensionare) quell'array con un valore fisso (es, 4 KB: 4096)
    - La risposta dal server va letta in un ciclo (perchè potrebbe essere "più grande" di 4 KB) e ciascun blocco va accodato da qualche altra parte
    - Quando avrai letto tutta la risposta, puoi procedere con la creazione dell'immagine

    2) L'accesso ai componenti grafici della App non va fatta dall'interno del thread, ma va fatto solo ed esclusivamente dal thread principale della App... a questo proposito, quindi, invece di creare un semplice Thread, dovresti sfruttare una classe molto usata per questo genere di cose: AsyncTask. Tale classe ti permette di eseguire lavori "onerosi" all'interno di un thread separato e di riavere il risultato all'interno del UI thread... dal quale potrai modificare i componenti grafici.


    Ciao.
    Ultima modifica di LeleFT; 14-12-2016 a 18:08
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Grazie per la risposta!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.