camera
HTTP Camera live preview example
With this example we are going to demonstrate how to create Live Camera preview in Android. The Android SDK includes a Camera class that is used to set image capture settings, start/stop preview, snap pictures, and retrieve frames for encoding for video. It is a handy abstraction of the real hardware device
What we are essentially going to do is setup a web camera to publish static images in a predefined URL and then grab these images from our application and present them as motion pictures
In short, to create live camera previews you should:
- extend the SurfaceView class and implement the SurfaceHolder.Callback interface
- provide our implementation using the device’s camera
- use the setContentView method of our Activity in order to set the activity content to that specific
- use the setPreviewDisplay method to set the Surface to be used for the live preview
as shown in the code snippets below:
package com.javacodegeeks.android.camera; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; public class HttpCamera { private static final int CONNECT_TIMEOUT = 1000; private static final int SOCKET_TIMEOUT = 1000; private final String url; private final Rect bounds; private final boolean preserveAspectRatio; private final Paint paint = new Paint(); public HttpCamera(String url, int width, int height, boolean preserveAspectRatio) { this.url = url; bounds = new Rect(0, 0, width, height); this.preserveAspectRatio = preserveAspectRatio; paint.setFilterBitmap(true); paint.setAntiAlias(true); } private Bitmap retrieveBitmap() throws IOException { Bitmap bitmap = null; InputStream in = null; int response = -1; try { URL url = new URL(this.url); HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); httpConn.setConnectTimeout(CONNECT_TIMEOUT); httpConn.setReadTimeout(SOCKET_TIMEOUT); httpConn.setRequestMethod("GET"); httpConn.connect(); response = httpConn.getResponseCode(); if (response == HttpURLConnection.HTTP_OK) { in = httpConn.getInputStream(); bitmap = BitmapFactory.decodeStream(in); } return bitmap; } catch (Exception e) { return null; } finally { if (in != null) try { in.close(); } catch (IOException e) { /* ignore */ } } } public boolean captureAndDraw(Canvas canvas) throws IOException { Bitmap bitmap = retrieveBitmap(); if (bitmap == null) throw new IOException("Response Code: "); //render it to canvas, scaling if necessary if (bounds.right == bitmap.getWidth() && bounds.bottom == bitmap.getHeight()) { canvas.drawBitmap(bitmap, 0, 0, null); } else { Rect dest; if (preserveAspectRatio) { dest = new Rect(bounds); dest.bottom = bitmap.getHeight() * bounds.right / bitmap.getWidth(); dest.offset(0, (bounds.bottom - dest.bottom)/2); } else { dest = bounds; } canvas.drawBitmap(bitmap, null, dest, paint); } return true; } }
package com.javacodegeeks.android.camera; import android.content.Context; import android.graphics.Canvas; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; public class HttpCameraPreview extends SurfaceView implements SurfaceHolder.Callback { private static final String url = "http://10.0.2.2:8080"; private CanvasThread canvasThread; private SurfaceHolder holder; private HttpCamera camera; private int viewWidth; private int viewHeight; public HttpCameraPreview(Context context, int viewWidth, int viewHeight) { super(context); holder = getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_NORMAL); this.viewWidth = viewWidth; this.viewHeight = viewHeight; canvasThread = new CanvasThread(); } @Override public void surfaceChanged(SurfaceHolder holder2, int format, int w, int h) { try { Canvas c = holder.lockCanvas(null); camera.captureAndDraw(c); if (c != null) { holder.unlockCanvasAndPost(c); } } catch (Exception e) { Log.e(getClass().getSimpleName(), "Error when surface changed", e); camera = null; } } @Override public void surfaceCreated(SurfaceHolder arg0) { try { camera = new HttpCamera(url, viewWidth, viewHeight, true); canvasThread.setRunning(true); canvasThread.start(); } catch (Exception e) { Log.e(getClass().getSimpleName(), "Error while creating surface", e); camera = null; } } @Override public void surfaceDestroyed(SurfaceHolder arg0) { camera = null; boolean retry = true; canvasThread.setRunning(false); while (retry) { try { canvasThread.join(); retry = false; } catch (InterruptedException e) { } } } private class CanvasThread extends Thread { private boolean running; public void setRunning(boolean running){ this.running = running; } public void run() { while (running) { Canvas c = null; try { c = holder.lockCanvas(null); synchronized (holder) { camera.captureAndDraw(c); } } catch (Exception e) { Log.e(getClass().getSimpleName(), "Error while drawing canvas", e); } finally { if (c != null) { holder.unlockCanvasAndPost(c); } } } } } }
package com.javacodegeeks.android.camera; import android.app.Activity; import android.os.Bundle; import android.view.Display; import android.view.SurfaceView; import android.view.Window; public class MyCamAppActivity extends Activity { private int viewWidth; private int viewHeight; private SurfaceView cameraPreview; private static final boolean useHttpCamera = true; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); calculateDisplayDimensions(); if (useHttpCamera) { cameraPreview = new HttpCameraPreview(this, viewWidth, viewHeight); } else { cameraPreview = new CameraPreview(this); } setContentView(cameraPreview); } private void calculateDisplayDimensions() { Display display = getWindowManager().getDefaultDisplay(); viewWidth = display.getWidth(); viewHeight = display.getHeight(); } }
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.javacodegeeks.android.camera" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".MyCamAppActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="3" /> <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.INTERNET" /> </manifest>
This was an example of how to create Live Camera previews in Android.
Related Article:
cameraPreview = new CameraPreview(this);
problem with this line….
cameraPreview = new CameraPreview(this);
it is showing the error….
Cannot resolve symbol ‘CameraPreview’