package com.camera.simplemjpeg; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.net.URI; import java.net.UnknownHostException; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.content.Intent; import android.content.SharedPreferences; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; public class MjpegActivity extends Activity { private static final boolean DEBUG=false; private static final String TAG = "MJPEG"; private MjpegView mv = null; String URL; // for settings (network and resolution) private static final int REQUEST_SETTINGS = 0; private int width = 640; private int height = 480; private int ip_ad1 = 192; private int ip_ad2 = 168; private int ip_ad3 = 2; private int ip_ad4 = 1; private int ip_port = 80; private String ip_command = "?action=stream"; private boolean suspending = false; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SharedPreferences preferences = getSharedPreferences("SAVED_VALUES", MODE_PRIVATE); width = preferences.getInt("width", width); height = preferences.getInt("height", height); ip_ad1 = preferences.getInt("ip_ad1", ip_ad1); ip_ad2 = preferences.getInt("ip_ad2", ip_ad2); ip_ad3 = preferences.getInt("ip_ad3", ip_ad3); ip_ad4 = preferences.getInt("ip_ad4", ip_ad4); ip_port = preferences.getInt("ip_port", ip_port); ip_command = preferences.getString("ip_command", ip_command); StringBuilder sb = new StringBuilder(); String s_http = "http://"; String s_dot = "."; String s_colon = ":"; String s_slash = "/"; sb.append(s_http); sb.append(ip_ad1); sb.append(s_dot); sb.append(ip_ad2); sb.append(s_dot); sb.append(ip_ad3); sb.append(s_dot); sb.append(ip_ad4); sb.append(s_colon); sb.append(ip_port); sb.append(s_slash); sb.append(ip_command); URL = new String(sb); setContentView(R.layout.main); mv = (MjpegView) findViewById(R.id.mv); if(mv != null){ mv.setResolution(width, height); } new DoRead().execute(URL); } public void onResume() { if(DEBUG) Log.d(TAG,"onResume()"); super.onResume(); if(mv!=null){ if(suspending){ new DoRead().execute(URL); suspending = false; } } } public void onStart() { if(DEBUG) Log.d(TAG,"onStart()"); super.onStart(); communication_start pipo = new communication_start("82.234.53.234", 8080); pipo.execute(); } public void onPause() { if(DEBUG) Log.d(TAG,"onPause()"); super.onPause(); if(mv!=null){ if(mv.isStreaming()){ mv.stopPlayback(); suspending = true; } } } public void onStop() { if(DEBUG) Log.d(TAG,"onStop()"); super.onStop(); communication_stop stop = new communication_stop("82.234.53.234", 8080); stop.execute(); } public void onDestroy() { if(DEBUG) Log.d(TAG,"onDestroy()"); if(mv!=null){ mv.freeCameraMemory(); } super.onDestroy(); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.layout.option_menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.settings: Intent settings_intent = new Intent(MjpegActivity.this, SettingsActivity.class); settings_intent.putExtra("width", width); settings_intent.putExtra("height", height); settings_intent.putExtra("ip_ad1", ip_ad1); settings_intent.putExtra("ip_ad2", ip_ad2); settings_intent.putExtra("ip_ad3", ip_ad3); settings_intent.putExtra("ip_ad4", ip_ad4); settings_intent.putExtra("ip_port", ip_port); settings_intent.putExtra("ip_command", ip_command); startActivityForResult(settings_intent, REQUEST_SETTINGS); return true; } return false; } public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case REQUEST_SETTINGS: if (resultCode == Activity.RESULT_OK) { width = data.getIntExtra("width", width); height = data.getIntExtra("height", height); ip_ad1 = data.getIntExtra("ip_ad1", ip_ad1); ip_ad2 = data.getIntExtra("ip_ad2", ip_ad2); ip_ad3 = data.getIntExtra("ip_ad3", ip_ad3); ip_ad4 = data.getIntExtra("ip_ad4", ip_ad4); ip_port = data.getIntExtra("ip_port", ip_port); ip_command = data.getStringExtra("ip_command"); if(mv!=null){ mv.setResolution(width, height); } SharedPreferences preferences = getSharedPreferences("SAVED_VALUES", MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); editor.putInt("width", width); editor.putInt("height", height); editor.putInt("ip_ad1", ip_ad1); editor.putInt("ip_ad2", ip_ad2); editor.putInt("ip_ad3", ip_ad3); editor.putInt("ip_ad4", ip_ad4); editor.putInt("ip_port", ip_port); editor.putString("ip_command", ip_command); editor.commit(); new RestartApp().execute(); } break; } } public class DoRead extends AsyncTask<String, Void, MjpegInputStream> { protected MjpegInputStream doInBackground(String... url) { //TODO: if camera has authentication deal with it and don't just not work HttpResponse res = null; DefaultHttpClient httpclient = new DefaultHttpClient(); HttpParams httpParams = httpclient.getParams(); HttpConnectionParams.setConnectionTimeout(httpParams, 5*1000); Log.d(TAG, "1. Sending http request"); try { res = httpclient.execute(new HttpGet(URI.create(url[0]))); Log.d(TAG, "2. Request finished, status = " + res.getStatusLine().getStatusCode()); if(res.getStatusLine().getStatusCode()==401){ //You must turn off camera User Access Control before this will work return null; } return new MjpegInputStream(res.getEntity().getContent()); } catch (ClientProtocolException e) { e.printStackTrace(); Log.d(TAG, "Request failed-ClientProtocolException", e); //Error connecting to camera } catch (IOException e) { e.printStackTrace(); Log.d(TAG, "Request failed-IOException", e); //Error connecting to camera } return null; } protected void onPostExecute(MjpegInputStream result) { mv.setSource(result); if(result!=null) result.setSkip(1); mv.setDisplayMode(MjpegView.SIZE_BEST_FIT); mv.showFps(false); } } public class RestartApp extends AsyncTask<Void, Void, Void> { protected Void doInBackground(Void... v) { MjpegActivity.this.finish(); return null; } protected void onPostExecute(Void v) { startActivity((new Intent(MjpegActivity.this, MjpegActivity.class))); } } /************************************************/ public class communication_start extends AsyncTask<Void, Void, Void> { String dstAddress; int dstPort; String response = ""; communication_start(String addr, int port) { dstAddress = addr; dstPort = port; } @Override protected Void doInBackground(Void... arg0) { Socket socket = null; try { socket = new Socket(dstAddress, dstPort); // envoi un message au serveur BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter pw = new PrintWriter(socket.getOutputStream(), true); pw.println("cmd_flux_start"); if (socket != null) socket.close(); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); response = "UnknownHostException: " + e.toString(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); response = "IOException: " + e.toString(); } finally { if(socket != null) { try { socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return null; } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); } } public class communication_stop extends AsyncTask<Void, Void, Void> { String dstAddress; int dstPort; String response = ""; communication_stop(String addr, int port) { dstAddress = addr; dstPort = port; } @Override protected Void doInBackground(Void... arg0) { Socket patoche = null; try { patoche = new Socket(dstAddress, dstPort); // envoi un message au serveur BufferedReader br = new BufferedReader(new InputStreamReader(patoche.getInputStream())); PrintWriter pw = new PrintWriter(patoche.getOutputStream(), true); pw.println("cmd_flux_stop"); if (patoche != null) patoche.close(); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); response = "UnknownHostException: " + e.toString(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); response = "IOException: " + e.toString(); } finally { if(patoche != null) { try { patoche.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return null; } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); } } }