title: Android Camera two preview from single camera
body: <p>I want to build application android about camera two preview from a single camera <a href="http://i.stack.imgur.com/sQHtb.png" rel="nofollow">enter image description here</a></p>
  
  <p>I tried build app,I using SurfaceView in Android Studio but I have problem, <a href="http://i.stack.imgur.com/fkROB.png" rel="nofollow">enter image description here</a></p>
  
  <p>I want example code, Can you help me please?
  Thank you so much.</p>
  
  <hr>
  
  <p>I tried app. </p>
  
  <p>AndroidSurfaceviewExample.java
  <div class="snippet" data-lang="js" data-hide="false">
  <div class="snippet-code">
  <pre class="snippet-code-html lang-html prettyprint-override"><code>package th.in.cybernoi.cardboardview;
  
  import java.io.File;
  import java.io.FileNotFoundException;
  import java.io.FileOutputStream;
  import java.io.IOException;
  import java.text.SimpleDateFormat;
  import java.util.Date;
  
  import android.app.Activity;
  import android.content.Context;
  import android.content.pm.PackageManager;
  import android.hardware.Camera;
  import android.hardware.Camera.PictureCallback;
  import android.hardware.Camera.CameraInfo;
  import android.hardware.Camera.ShutterCallback;
  import android.os.Bundle;
  import android.util.Log;
  import android.view.SurfaceHolder;
  import android.view.SurfaceView;
  import android.view.View;
  import android.view.WindowManager;
  import android.view.View.OnClickListener;
  import android.widget.Button;
  import android.widget.LinearLayout;
  import android.widget.TextView;
  import android.widget.Toast;
  
  
  public class AndroidSurfaceviewExample extends Activity implements SurfaceHolder.Callback  {
      TextView testView;
  
      Camera camera;
      SurfaceView surfaceView;
      SurfaceHolder surfaceHolder;
  
      PictureCallback rawCallback;
      ShutterCallback shutterCallback;
      PictureCallback jpegCallback;
  
  
      /** Called when the activity is first created. */
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
  
          setContentView(R.layout.activity_main);
  
          surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
          surfaceHolder = surfaceView.getHolder();
  
          // Install a SurfaceHolder.Callback so we get notified when the
          // underlying surface is created and destroyed.
          surfaceHolder.addCallback(this);
  
          // deprecated setting, but required on Android versions prior to 3.0
          surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  
          jpegCallback = new PictureCallback() {
              public void onPictureTaken(byte[] data, Camera camera) {
                  FileOutputStream outStream = null;
                  try {
                      outStream = new FileOutputStream(String.format("/sdcard/%d.jpg", System.currentTimeMillis()));
                      outStream.write(data);
                      outStream.close();
                      Log.d("Log", "onPictureTaken - wrote bytes: " + data.length);
                  } catch (FileNotFoundException e) {
                      e.printStackTrace();
                  } catch (IOException e) {
                      e.printStackTrace();
                  } finally {
                  }
                  Toast.makeText(getApplicationContext(), "Picture Saved", 2000).show();
                  refreshCamera();
              }
          };
      }
  
  
  
      //Surfacrview
      public void captureImage(View v) throws IOException {
          //take the picture
          camera.takePicture(null, null, jpegCallback);
      }
  
      public void refreshCamera() {
          if (surfaceHolder.getSurface() == null) {
              // preview surface does not exist
              return;
          }
  
          // stop preview before making changes
          try {
              camera.stopPreview();
          } catch (Exception e) {
              // ignore: tried to stop a non-existent preview
          }
  
          // set preview size and make any resize, rotate or
          // reformatting changes here
          // start preview with new settings
          try {
              camera.setPreviewDisplay(surfaceHolder);
              camera.startPreview();
          } catch (Exception e) {
  
          }
      }
  
      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.
          refreshCamera();
      }
  
      public void surfaceCreated(SurfaceHolder holder) {
          try {
              // open the camera
              camera = Camera.open();
          } catch (RuntimeException e) {
              // check for exceptions
              System.err.println(e);
              return;
          }
          Camera.Parameters param;
          param = camera.getParameters();
  
          // modify parameter
          param.setPreviewSize(352, 288);
          camera.setParameters(param);
          try {
              // The Surface has been created, now tell the camera where to draw
              // the preview.
              camera.setPreviewDisplay(surfaceHolder);
              camera.startPreview();
          } catch (Exception e) {
              // check for exceptions
              System.err.println(e);
              return;
          }
      }
  
      public void surfaceDestroyed(SurfaceHolder holder) {
          // stop preview and release camera
          camera.stopPreview();
          camera.release();
          camera = null;
      }
  
  }</code></pre>
  </div>
  </div>
  </p>
  
  <p>activity_main.xml</p>
  
  <p><div class="snippet" data-lang="js" data-hide="false">
  <div class="snippet-code">
  <pre class="snippet-code-html lang-html prettyprint-override"><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:orientation="horizontal"
      tools:context="th.in.cybernoi.cardboardview.MainActivity"&gt;
  
      &lt;SurfaceView
          android:id="@+id/surfaceView"
          android:layout_width="0dp"
          android:layout_height="match_parent"
          android:layout_weight="1" /&gt;
  
      &lt;SurfaceView
          android:id="@+id/surfaceView"
          android:layout_width="0dp"
          android:layout_height="match_parent"
          android:layout_weight="1" /&gt;
  
  &lt;/LinearLayout&gt;</code></pre>
  </div>
  </div>
  </p>
  
  <hr>
  
  <p>Update Edit code Now :9/02/16</p>
  
  <ol>
  <li>edit to AndroidSurfaceviewExample.java 
  
  <ul>
  <li>add public void onPreviewFrame() </li>
  </ul></li>
  </ol>
  
  <p><div class="snippet" data-lang="js" data-hide="false">
  <div class="snippet-code">
  <pre class="snippet-code-html lang-html prettyprint-override"><code>    public class AndroidSurfaceviewExample extends Activity implements SurfaceHolder.Callback {
      TextView testView;
  
      Camera camera;
      SurfaceHolder camera01;
      SurfaceHolder camera02;
  
      SurfaceView surfaceViewLeft;
      SurfaceHolder surfaceHolderLeft;
  
      SurfaceView surfaceViewRight;
      SurfaceHolder surfaceHolderRight;
  
      PictureCallback rawCallback;
      ShutterCallback shutterCallback;
      PictureCallback jpegCallback;
      /**
       * ATTENTION: This was auto-generated to implement the App Indexing API.
       * See https://g.co/AppIndexing/AndroidStudio for more information.
       */
      private GoogleApiClient client;
  
  
      /**
       * Called when the activity is first created.
       */
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
  
          setContentView(R.layout.activity_main);
  
          surfaceViewLeft = (SurfaceView) findViewById(R.id.surfaceViewLeft);
          surfaceHolderLeft = surfaceViewLeft.getHolder();
  
          surfaceViewRight = (SurfaceView) findViewById(R.id.surfaceViewRight);
          surfaceHolderRight = surfaceViewRight.getHolder();
  
          // Install a SurfaceHolder.Callback so we get notified when the
          // underlying surface is created and destroyed.
          surfaceHolderLeft.addCallback(this);
          surfaceHolderRight.addCallback(this);
  
          // deprecated setting, but required on Android versions prior to 3.0
          surfaceHolderLeft.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
          surfaceHolderRight.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  
          /*
          jpegCallback = new PictureCallback() {
              public void onPictureTaken(byte[] data, Camera camera) {
                  FileOutputStream outStream = null;
                  try {
                      outStream = new FileOutputStream(String.format("/sdcard/%d.jpg", System.currentTimeMillis()));
                      outStream.write(data);
                      outStream.close();
                      Log.d("Log", "onPictureTaken - wrote bytes: " + data.length);
                  } catch (FileNotFoundException e) {
                      e.printStackTrace();
                  } catch (IOException e) {
                      e.printStackTrace();
                  } finally {
                  }
                  Toast.makeText(getApplicationContext(), "Picture Saved", 2000).show();
                  refreshCamera();
              }
  
  
          };
          */
          // ATTENTION: This was auto-generated to implement the App Indexing API.
          // See https://g.co/AppIndexing/AndroidStudio for more information.
          client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
      }
  
  
      //Surfacrview
  
  
      public void refreshCamera() {
          if (surfaceHolderLeft.getSurface() == null) {
              // preview surface does not exist
              return;
          }
  
          // stop preview before making changes
          try {
              camera.stopPreview();
          } catch (Exception e) {
              // ignore: tried to stop a non-existent preview
          }
  
          // set preview size and make any resize, rotate or
          // reformatting changes here
          // start preview with new settings
          try {
              camera.setPreviewDisplay(surfaceHolderLeft);
              camera.startPreview();
  
  
          } catch (Exception e) {
  
          }
      }
  
  
  
      public void onPreviewFrame() {
  
          if (surfaceHolderRight.getSurface() == null) {
              // preview surface does not exist
              return;
          }
  
  
          // stop preview before making changes
          try {
              camera.stopPreview();
          } catch (Exception e) {
              // ignore: tried to stop a non-existent preview
          }
  
          // set preview size and make any resize, rotate or
          // reformatting changes here
          // start preview with new settings
          try {
              surfaceHolderLeft.lockCanvas();
              camera.setPreviewDisplay(surfaceHolderRight);
              camera.setPreviewCallback((Camera.PreviewCallback) surfaceHolderLeft);
              camera.startPreview();
  
  
          } catch (Exception e) {
  
          }
  
  
      }
  
  
      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.
          refreshCamera();
          onPreviewFrame();
          
      }
  
      public void surfaceCreated(SurfaceHolder holder) {
          try {
              // open the camera
              camera = Camera.open();
          } catch (RuntimeException e) {
              // check for exceptions
              System.err.println(e);
              return;
          }
          Camera.Parameters param;
          param = camera.getParameters();
  
          // modify parameter
          param.setPreviewSize(352, 288);
          camera.setParameters(param);
          try {
              // The Surface has been created, now tell the camera where to draw
              // the preview.
              camera.setPreviewDisplay(surfaceHolderLeft);
              camera.startPreview();
          } catch (Exception e) {
              // check for exceptions
              System.err.println(e);
              return;
          }
      }
  
      public void surfaceDestroyed(SurfaceHolder holder) {
          // stop preview and release camera
          camera.stopPreview();
          camera.release();
          camera = null;
      }
  
      @Override
      public void onStart() {
          super.onStart();
  
          // ATTENTION: This was auto-generated to implement the App Indexing API.
          // See https://g.co/AppIndexing/AndroidStudio for more information.
          client.connect();
          Action viewAction = Action.newAction(
                  Action.TYPE_VIEW, // TODO: choose an action type.
                  "AndroidSurfaceviewExample Page", // TODO: Define a title for the content shown.
                  // TODO: If you have web page content that matches this app activity's content,
                  // make sure this auto-generated web page URL is correct.
                  // Otherwise, set the URL to null.
                  Uri.parse("http://host/path"),
                  // TODO: Make sure this auto-generated app deep link URI is correct.
                  Uri.parse("android-app://th.in.cybernoi.cardboardview/http/host/path")
          );
          AppIndex.AppIndexApi.start(client, viewAction);
      }
  
      @Override
      public void onStop() {
          super.onStop();
  
          // ATTENTION: This was auto-generated to implement the App Indexing API.
          // See https://g.co/AppIndexing/AndroidStudio for more information.
          Action viewAction = Action.newAction(
                  Action.TYPE_VIEW, // TODO: choose an action type.
                  "AndroidSurfaceviewExample Page", // TODO: Define a title for the content shown.
                  // TODO: If you have web page content that matches this app activity's content,
                  // make sure this auto-generated web page URL is correct.
                  // Otherwise, set the URL to null.
                  Uri.parse("http://host/path"),
                  // TODO: Make sure this auto-generated app deep link URI is correct.
                  Uri.parse("android-app://th.in.cybernoi.cardboardview/http/host/path")
          );
          AppIndex.AppIndexApi.end(client, viewAction);
          client.disconnect();
      }
  }</code></pre>
  </div>
  </div>
  </p>