J'essaie de créer une application Android sur le studio android qui se transforme en serveur distant et exécute une commande. Il doit également transférer le port 8080 à partir du serveur distant qui configure un flux HTTP sur vlc. Cela doit ensuite être utilisé dans un widget videoview qui affiche la vidéo dans l'application. Cette application s'exécute sans erreurs dans le logcat et exécute la commande ssh avec succès, mais la vue vidéo montre juste une boîte noire - je soupçonne qu'il y a quelque chose qui ne va pas avec mon code. Toute aide serait grandiose!Diffuser une vidéo http sur une application android
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final VideoView videoView = (VideoView) findViewById(R.id.videoView);
new AsyncTask<Integer, Void, Void>() {
@Override
protected Void doInBackground(Integer... params) {
try {
executeRemoteCommand0("xxx", "xxx", "xxx", 22, videoView);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}.execute(1);
try {
sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
videoView.setVideoPath(String.format("http://localhost:%d/video.mp4", 5000));
videoView.start();
}
public String executeRemoteCommand0(String username, String password, String hostname, int port, VideoView videoView) throws Exception {
JSch jsch = new JSch();
Session session = jsch.getSession(username, hostname, port);
session.setPassword(password);
// Avoid asking for key confirmation
Properties prop = new Properties();
prop.put("StrictHostKeyChecking", "no");
session.setConfig(prop);
int camport = session.setPortForwardingL(5000, hostname,8080);
session.connect();
// SSH Channel
ChannelExec channelssh = (ChannelExec) session.openChannel("exec");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
channelssh.setOutputStream(baos);
// Execute command
channelssh.setCommand("command");
channelssh.setPty(true);
channelssh.connect();
return baos.toString();
}
}
Je pensais après avoir retransmis le port 8080 du serveur distant à 5000 du serveur local, vous pouvez y accéder localement? En outre, j'ai essayé de mettre la vue vidéo dans la tâche asynchrone mais cela jette un 'besoin de déclarer looper.prepare() et quand je fais toutes les variables ne sont plus résolues dans la fonction des bibliothèques externes. Je connais sa super maladresse:/ – Liz
Faire référence à 'localhost' signifie que vous avez une instance du serveur déployée sur le périphérique mobile (ce qui n'est évidemment pas le cas). Vous devez définir le chemin du lecteur vidéo sur le thread principal. Vous pouvez implémenter la méthode 'onPostExecute()' de votre 'AsyncTask'. Il sera appelé sur le thread principal après que l'arrière-plan soit terminé. –
Est-il nécessaire de transférer le port à l'origine alors? Ou fonctionne-t-elle comme une URL? Merci pour l'astuce sur le onPostExecute() :) – Liz