Wednesday, 1 May 2013

Set Live Frame on Camera Capturing Image in Android

Hi Guys,
Hope All of You Doing Well.
Here I am going to show you how to put live Photo Frame on Android Camera. Sometime you need to put a fabulous Photo frame during your image captures. It is more interesting to put a Frame during image capture than after image captures. Live frame putting give you a edge over static frame putting because it provide easily adjustment of your image captures.
Here is the code
Create a Android Activity and put it name CameraOverview1 . Copy and paste following code in this class.
public class CameraOverview1 extends Activity implements SurfaceHolder.Callback{

private Camera camera = null;
private SurfaceView cameraSurfaceView = null;
private SurfaceHolder cameraSurfaceHolder = null;
private boolean previewing = false;

private Display display = null;


private static int wid = 0, hgt = 0;

private LayoutInflater layoutInflater = null;
private View cameraViewControl = null;
private LayoutParams layoutParamsControl = null;

private Button btnCapture = null;

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

    display = getWindowManager().getDefaultDisplay(); 
    wid = display.getWidth();
    hgt = display.getHeight();

    getWindow().setFormat(PixelFormat.TRANSLUCENT);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

    setContentView(R.layout.cameraoverlay1);

    cameraSurfaceView = (SurfaceView)findViewById(R.id.cameraSurfaceView);
    cameraSurfaceHolder = cameraSurfaceView.getHolder();
    cameraSurfaceHolder.addCallback(this);
    cameraSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    layoutInflater = LayoutInflater.from(getBaseContext());
    layoutParamsControl = new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT);

    cameraViewControl = layoutInflater.inflate(R.layout.cambutton, null);     
    this.addContentView(cameraViewControl, layoutParamsControl);
btnCapture = (Button)findViewById(R.id.btnCapture);
    btnCapture.setOnClickListener(new OnClickListener() 
    {   
        @Override
        public void onClick(View v) 
        {
            // TODO Auto-generated method stub
            camera.takePicture(cameraShutterCallback, 
                    cameraPictureCallbackRaw,
                    cameraPictureCallbackJpeg);
        }
    });
} 

ShutterCallback cameraShutterCallback = new ShutterCallback() 
{  
    @Override
    public void onShutter() 
    {
        // TODO Auto-generated method stub   
    }
};

PictureCallback cameraPictureCallbackRaw = new PictureCallback() 
{  
    @Override
    public void onPictureTaken(byte[] data, Camera camera) 
    {
        // TODO Auto-generated method stub   
    }
};

PictureCallback cameraPictureCallbackJpeg = new PictureCallback() 
{  
    @Override
    public void onPictureTaken(byte[] data, Camera camera) 
    {
        // TODO Auto-generated method stub   
        Bitmap cameraBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);

        wid = cameraBitmap.getWidth();
        hgt = cameraBitmap.getHeight();

        Bitmap newImage = Bitmap.createBitmap(wid, hgt, Bitmap.Config.ARGB_8888);

        Canvas canvas = new Canvas(newImage);

        canvas.drawBitmap(cameraBitmap, 0f, 0f, null);

        Drawable drawable = getResources().getDrawable
                (R.drawable.frame1);
        drawable.setBounds(0, 0, wid, hgt);
        drawable.draw(canvas);

        File storagePath = new File(Environment.
                getExternalStorageDirectory() + "/MyCameraApp/"); 
        storagePath.mkdirs(); 

        File myImage = new File(storagePath,
                Long.toString(System.currentTimeMillis()) + ".jpg");

        try
        {
            FileOutputStream out = new FileOutputStream(myImage);
            newImage.compress(Bitmap.CompressFormat.JPEG, 80, out);


            out.flush();
            out.close();
        }
        catch(FileNotFoundException e)
        {
            Log.d("In Saving File", e + "");    
        }
        catch(IOException e)
        {
            Log.d("In Saving File", e + "");
        }

        camera.startPreview();

        drawable = null;

        newImage.recycle();
        newImage = null;

        cameraBitmap.recycle();
        cameraBitmap = null;
    }
};

@Override
public void surfaceChanged(SurfaceHolder holder, 
        int format, int width, int height) 
{
    // TODO Auto-generated method stub

    if(previewing)
    {
        camera.stopPreview();
        previewing = false;
    }
    if (camera != null){
        try 
        {
    camera.setPreviewDisplay(cameraSurfaceHolder);
            camera.startPreview();
            previewing = true;
        } 
        catch (IOException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();  
        }
    }
}

@Override
public void surfaceCreated(SurfaceHolder holder) 
{
    // TODO Auto-generated method stub
    try
    {
        camera = Camera.open();
    }
    catch(RuntimeException e)
    {
        Toast.makeText(getApplicationContext(), "Device camera is not working properly, please try after sometime.", Toast.LENGTH_LONG).show();
    }
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) 
{
    // TODO Auto-generated method stub
    camera.stopPreview();
    camera.release();
    camera = null;
    previewing = false;
}}
Now You have to put xml file for GUI in your project. cameraoverlay1.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<SurfaceView
    android:id="@+id/cameraSurfaceView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/frame1" />
</LinearLayout>
and cambutton.xml  in your project layout folder.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="right"
android:orientation="vertical" >
<Button
    android:id="@+id/btnCapture"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    android:background="@drawable/cambutton"
    android:gravity="center_vertical" />
</LinearLayout>                                                            
This is the all source code to put a live photo frame during image captures in Android. This code just putting one simple static frame named as frame1.png, In my next blog i will write a full dynamic code for putting Live frame.Usercan choose Frame image before starting the image    Capture 
Happy Coding Thanks

14 comments:

  1. Great Tutorial. May I have the source code?

    ReplyDelete
  2. hi Saurabh, please a need you help for implement the code i have so many errors... thank you...

    ReplyDelete
  3. Hey Saurabha, Could you pls help me to develop an Android application that can choose a frame before the image capture? Kindly request you to replay me to aswanthrc@gmail.com.
    Thaq,... :)

    ReplyDelete
    Replies
    1. http://androidbyhp.blogspot.in/2011/07/android-creating-and-saving-overlay-on.html

      Delete
  4. Hello friend you help us quite a novice like me, placing full to guide better code. Cheers,

    ReplyDelete
  5. hello Saurabh,
    as many camera feature deprecated, can you please post or send the updated code for the same feature.

    thanks in advance
    shrishtee

    ReplyDelete
  6. Thanks man.
    You saved my life.:)

    ReplyDelete
  7. hello Can you please help me out with the live image on camera which will help the user of my app to see how their wall painting will look like before they buy it.

    ReplyDelete
  8. hello Saurabh, please a need you help for implement the code i have so many errors... pls provide full source code and how to add frame dyanmically

    ReplyDelete
  9. plz paste the next tutoria(live frame)code/link

    ReplyDelete
  10. So did you finish reading Voracious? How was it? :D

    ReplyDelete

Build a Custom Kernel Module for Android

Hi Guys!!!Hope you are doing well !!!. Today I will describe how you can write a custom kernel module(Hello world) for Android and load it a...