//original from: http://itp.nyu.edu/~dbo3/blog/?p=122 package com.openideals.android.media; import java.io.DataInputStream; import java.io.DataOutputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLEncoder; import android.app.Activity; import android.content.Context; import android.graphics.PixelFormat; import android.hardware.Camera; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.Window; public class CameraHat extends Activity implements Camera.PreviewCallback, Camera.ShutterCallback, Camera.PictureCallback { final String TAG = "CameraHat"; Camera mCamera; private Preview mPreview; boolean freeToSend = true; ShutterThread myShutterThread; class ShutterThread extends Thread { public void run(){ while (true){ if (freeToSend){ freeToSend = false; Log.v(TAG,"thread ready"); takePicture(); } } } } public void takePicture(){ mCamera.takePicture(this, null, this); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Hide the window title. requestWindowFeature(Window.FEATURE_NO_TITLE); // Create our Preview view and set it as the content of our activity. mCamera = Camera.open(); Camera.Parameters p = mCamera.getParameters(); int CAM_W = 160; int CAM_H = 120; p.setPictureSize(CAM_W, CAM_H); p.setPictureFormat(PixelFormat.JPEG); //p.setPreviewFormat(PixelFormat.JPEG); mCamera.setParameters(p); //mCamera.setPreviewCallback(this); mPreview = new Preview(this); setContentView(mPreview); myShutterThread = new ShutterThread(); myShutterThread.start(); } // �����������������������- @Override public boolean onKeyDown(int keycode, KeyEvent event) { Log.v(TAG, "KeyDown" + keycode); if (keycode == KeyEvent.KEYCODE_CAMERA || keycode == 8) { mCamera.takePicture(this, null, this); mCamera.startPreview(); } super.onKeyDown(keycode, event); return true; } // private Camera.ShutterCallback sillyDelay = new Camera.ShutterCallback() { public void onPreviewFrame(byte[] data, Camera camera) { if (freeToSend){ freeToSend = false; Log.v(TAG,"preview"); new Uploader("http://itp.nyu.edu/~dbo3/up.php", data, "androidTest.jpg"); } } public void onShutter() { Camera.Parameters p = mCamera.getParameters(); int CAM_W = 160; int CAM_H = 120; p.setPictureSize(CAM_W, CAM_H); p.setPictureFormat(PixelFormat.JPEG); //p.setPreviewFormat(PixelFormat.JPEG); mCamera.setParameters(p); } // }; // private Camera.PictureCallback doSomeThingWithIt = new Camera.PictureCallback() { public void onPictureTaken(byte[] data, Camera camera) { Log.v(TAG, "Took Picture" + data.length); mCamera.stopPreview(); new Uploader("http://itp.nyu.edu/~dbo3/up.php", data, "androidTest.jpg"); mCamera.startPreview(); // doPost("http://itp.nyu.edu/~dbo3/upity.php", test.getBytes()); } // }; class Preview extends SurfaceView implements SurfaceHolder.Callback { SurfaceHolder mHolder; Preview(Context context) { super(context); // Install a SurfaceHolder.Callback so we get notified when the // underlying surface is created and destroyed. mHolder = getHolder(); mHolder.addCallback(this); mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } public void surfaceCreated(SurfaceHolder holder) { // The Surface has been created, acquire the camera and tell it where // to draw. mCamera.setPreviewDisplay(holder); } public void surfaceDestroyed(SurfaceHolder holder) { // Surface will be destroyed when we return, so stop the preview. // Because the CameraDevice object is not a shared resource, it's very // important to release it when the activity is paused. mCamera.stopPreview(); mCamera = null; } public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { // Now that the size is known, set up the camera parameters and begin // the preview. //Camera.Parameters parameters = mCamera.getParameters(); ///parameters.setPreviewSize(w, h); //mCamera.setParameters(parameters); mCamera.startPreview(); } } public class Uploader extends Thread { String urlString; byte[] payload; String fileNameOnServer; public Uploader(String _urlString, byte[] _payload, String _fileNameOnServer) { urlString = _urlString; payload = _payload; fileNameOnServer = _fileNameOnServer; start(); } public void run() { HttpURLConnection conn = null; DataOutputStream dos = null; DataInputStream inStream = null; String lineEnd = "\r\n"; String twoHyphens = "�"; String boundary = "����������29772313742745"; try { // ������ CLIENT REQUEST URL url = new URL(urlString); // Open a HTTP connection to the URL conn = (HttpURLConnection) url.openConnection(); // Allow Inputs conn.setDoInput(true); // Allow Outputs conn.setDoOutput(true); // Don't use a cached copy. conn.setUseCaches(false); // Use a post method. conn.setRequestMethod("POST"); conn.setRequestProperty("Connection", "Keep-Alive"); // conn.setRequestProperty("Cookie", "JSESSIONID="+PlayList.getSessionId()); conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); dos = new DataOutputStream(conn.getOutputStream()); dos.writeBytes(twoHyphens + boundary + lineEnd); // dos.writeBytes("Content-Disposition: form-data; name=\"fileNameOnServer\""+lineEnd+URLEncoder.encode(fileNameOnServer,"UTF-8") + lineEnd); //dos.writeBytes(("Content-Disposition: form-data; name=\"data_file\"; filename=\"" + lineEnd + URLEncoder.encode(fileNameOnServer, "UTF-8) + "\r\n")); dos.writeBytes("Content-Type: " + "image/jpg" + " \r\n"); dos.writeBytes(lineEnd); //Log.v(TAG, fileNameOnServer); Log.v(TAG, "Headers are written"); // create a buffer of maximum size dos.write(payload); dos.writeBytes(lineEnd); dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); // close streams Log.v(TAG, "File is written"); dos.flush(); dos.close(); } catch (MalformedURLException ex) { Log.v(TAG, "error: " + ex.getMessage(), ex); } catch (Exception ioe) { Log.v(TAG, "error: " + ioe.getMessage(), ioe); } // ������ read the SERVER RESPONSE try { inStream = new DataInputStream(conn.getInputStream()); String str; while ((str = inStream.readLine()) != null) { Log.v(TAG, "Server Response" + str); } inStream.close(); freeToSend = true; Log.v(TAG, "FreeToSend " + freeToSend); } catch (Exception ioex) { Log.v(TAG, "error: " + ioex.getMessage(), ioex); } } } }