I'm interested as well how that could work. I'm also looking for a way
to use the Preview app inside my application but don't know how to use
it inside my XML file.

On 6 Jul., 18:22, Bobalot <[EMAIL PROTECTED]> wrote:
> hi, im trying to make a simple camera app, by extending the
> CameraPreview class in the api demos, anyway im trying to cast the
> preview onto a surfaceview that i have defined in my layout xml file.
> but everytime i do this i get a null pointer exception, and i cant for
> the life of me figure out how to make this work.
>
> if anyone has any info or sample code i would be very gratefull.
> this is what i have so far, the Preview class is what i took from the
> CameraPreview.java
>
> ------------------------------------------------------------------------------------------------
> package bob.CameraAlbum;
>
> import android.app.Activity;
> import android.content.Context;
> import android.graphics.Canvas;
> import android.hardware.CameraDevice;
> import android.os.Bundle;
> import android.view.SurfaceHolder;
> import android.view.SurfaceView;
> import android.widget.TabHost;
> import android.widget.TabHost.TabSpec;
>
> public class Camera extends Activity {
>   private TabHost myTabHost;
>  private Preview mPreview;
>
>   @Override
>         protected void onCreate(Bundle icicle) {
>         super.onCreate(icicle);
>         //SurfaceHolder  mHolder;
>         // Hide the window title.
>       // requestWindowFeature(Window.FEATURE_NO_TITLE);
>
>         setContentView(R.layout.tabs);
>         mPreview = new Preview(this);
>
>         this.myTabHost = (TabHost)this.findViewById(R.id.tabhost);
>         this.myTabHost.setup();
>
>         TabSpec ts1 = myTabHost.newTabSpec("TAB1");
>         ts1.setIndicator("Take Photo",
> getResources().getDrawable(R.drawable.cameraphoto));
>         ts1.setContent(R.id.grid_set_menu_page1);
>         this.myTabHost.addTab(ts1);
>
>         TabSpec ts2 = myTabHost.newTabSpec("TAB2");
>         ts2.setIndicator("Album",
> getResources().getDrawable(R.drawable.driveharddisk));
>         ts2.setContent(R.id.grid_set_menu_page2);
>         this.myTabHost.addTab(ts2);
>
>         TabSpec ts3 = myTabHost.newTabSpec("TAB3");
>         ts3.setIndicator("Upload",
> getResources().getDrawable(R.drawable.networkwireless));
>         ts3.setContent(R.id.grid_set_menu_page3);
>         this.myTabHost.addTab(ts3);
>
>         this.myTabHost.setCurrentTab(0);
>
> //mPreview = (Preview) findViewById(R.id.photo_surface);
>
> }
>
>     @Override
>   protected void onResume() {
>   // Because the CameraDevice object is not a shared resource,
>   // it's very important to release it when the activity is paused.
>   super.onResume();
>   mPreview.resume();
>
> }
>
> @Override
>   protected void onPause() {
>   // Start Preview again when we resume.
>   super.onPause();
>   mPreview.pause();
>
> }
> }
>
> class Preview extends SurfaceView implements SurfaceHolder.Callback {
>     SurfaceHolder  mHolder;
>     private PreviewThread mPreviewThread;
>     private boolean mHasSurface;
> SurfaceView Sview;
>     Preview(Context context) {
>         super(context);
>
>         // Install a SurfaceHolder.Callback so we get notified when
> the
>         // underlying surface is created and destroyed.
>         Sview=(SurfaceView) findViewById(R.id.photo_surface);
>         mHolder = Sview.getHolder();
>
>         mHolder.addCallback(this);
>         mHasSurface = false;
>
>         // In this example, we hardcode the size of the preview. In a
> real
>         // application this should be more dynamic. This guarantees
> that
>         // the uderlying surface will never change size.
>         mHolder.setFixedSize(320, 240);
>     }
>
>     public void resume() {
>         // We do the actual acquisition in a separate thread. Create
> it now.
>         if (mPreviewThread == null) {
>             mPreviewThread = new PreviewThread();
>             // If we already have a surface, just start the thread now
> too.
>             if (mHasSurface == true) {
>                 mPreviewThread.start();
>             }
>         }
>     }
>
>     public void pause() {
>         // Stop Preview.
>         if (mPreviewThread != null) {
>             mPreviewThread.requestExitAndWait();
>             mPreviewThread = null;
>         }
>     }
>
>     public void surfaceCreated(SurfaceHolder holder) {
>         // The Surface has been created, start our main acquisition
> thread.
>         mHasSurface = true;
>         if (mPreviewThread != null) {
>             mPreviewThread.start();
>         }
>     }
>
>     public void surfaceDestroyed(SurfaceHolder holder) {
>         // Surface will be destroyed when we return. Stop the preview.
>         mHasSurface = false;
>         pause();
>     }
>
>     public void surfaceChanged(SurfaceHolder holder, int format, int
> w, int h) {
>         // Surface size or format has changed. This should not happen
> in this
>         // example.
>     }
>
>     //
> ----------------------------------------------------------------------
>
>     class PreviewThread extends Thread {
>         private boolean mDone;
>
>         PreviewThread() {
>             super();
>             mDone = false;
>         }
>
>         @Override
>                 public void run() {
>             // We first open the CameraDevice and configure it.
>             CameraDevice camera = CameraDevice.open();
>             if (camera != null) {
>                 CameraDevice.CaptureParams param = new
> CameraDevice.CaptureParams();
>                     param.type = 1; // preview
>                     param.srcWidth      = 1280;
>                     param.srcHeight     = 960;
>                     param.leftPixel     = 0;
>                     param.topPixel      = 0;
>                     param.outputWidth   = 320;
>                     param.outputHeight  = 240;
>                     param.dataFormat    = 2; // RGB_565
>                 camera.setCaptureParams(param);
>             }
>
>             // This is our main acquisition thread's loop, we go until
>             // asked to quit.
>             SurfaceHolder holder = mHolder;
>             while (!mDone) {
>                 // Lock the surface, this returns a Canvas that can
>                 // be used to render into.
>                 Canvas canvas = holder.lockCanvas();
>
>                 // Capture directly into the Surface
>                 if (camera != null) {
>                     camera.capture(canvas);
>                 }
>
>                 // And finally unlock and post the surface.
>                 holder.unlockCanvasAndPost(canvas);
>             }
>
>             // Make sure to release the CameraDevice
>             if (camera != null) {
>                                 camera.close();
>                         }
>         }
>
>         public void requestExitAndWait() {
>             // don't call this from PreviewThread thread or it a
> guaranteed
>             // deadlock!
>             mDone = true;
>             try {
>                 join();
>             } catch (InterruptedException ex) { }
>         }
>     }
>
> }
>
> -------------------------------------------------------------------------------------
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[EMAIL PROTECTED]
Announcing the new M5 SDK!
http://android-developers.blogspot.com/2008/02/android-sdk-m5-rc14-now-available.html
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to