KappaDragon
KappaDragon

Reputation: 61

Google Glass Camera: setPreviewCallback

I have an operating android app that utilizes preview callbacks, to process the image after every frame from the preview (the preview is paused for a minute while the calculations take place). It works great! But, now I am trying to get Google Glass to do the same thing: activate Preview, activate preview callback, activating the calculations.

This issue likely has to do with how Camera is defined: Camera mCamera = null;

but, I cannot define it as Camera.open(); with Google Glass because it fails. Thus when i get to defining the callback, I'm told it may produce a NullPointerException, and indeed I get the following error string:

Process: com.ead.glasscam.app, PID: 14231 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ead.glasscam.app/com.ead.glasscam.app.MainActivity}: java.lang.NullPointerException at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2235) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2285) at android.app.ActivityThread.access$800(ActivityThread.java:138) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1236) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:149) at android.app.ActivityThread.main(ActivityThread.java:5061) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:610) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.NullPointerException at com.ead.glasscam.app.MainActivity.onCreate(MainActivity.java:100) at android.app.Activity.performCreate(Activity.java:5236) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1089) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2199)             at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2285)             at android.app.ActivityThread.access$800(ActivityThread.java:138)             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1236)             at android.os.Handler.dispatchMessage(Handler.java:102)             at android.os.Looper.loop(Looper.java:149)             at android.app.ActivityThread.main(ActivityThread.java:5061)             at java.lang.reflect.Method.invokeNative(Native Method)             at java.lang.reflect.Method.invoke(Method.java:515)             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:610)             at dalvik.system.NativeStart.main(Native Method)

So, the code:

// Attach a callback for preview
mPreviewCallback camCallback = new mPreviewCallback();
mCamera.setPreviewCallback(camCallback);

What is mPreviewCallback?:

public class mPreviewCallback implements Camera.PreviewCallback {

    public void onPreviewFrame(byte[] data, final Camera camera){
        Log.i("CAMERA", "Triggered Preview Frame");
    }
}

I really don't understand how to do this simple process on Android, with Google Glass. Thank you for reading.

Upvotes: 0

Views: 631

Answers (1)

Johnny505
Johnny505

Reputation: 221

Checkout this example from jaredsburrows, it uses the camera preview on Glass and I used it in a project once (It Works! ;) )

https://github.com/jaredsburrows/OpenQuartz/tree/master/example-apps/OG_CameraApp

public class CameraView extends SurfaceView implements SurfaceHolder.Callback
{
    private SurfaceHolder surfaceHolder = null;
    private Camera camera = null;

    @SuppressWarnings("deprecation")
    public CameraView(Context context) 
    {
        super(context);

        surfaceHolder = this.getHolder();
        surfaceHolder.addCallback(this);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    /*
     * (non-Javadoc)
     * @see android.view.SurfaceHolder.Callback#surfaceCreated(android.view.SurfaceHolder)
     */
    @Override
    public void surfaceCreated(SurfaceHolder holder) 
    {
        camera = Camera.open();

        // Set the Hotfix for Google Glass
        this.setCameraParameters(camera);

        // Show the Camera display
        try 
        {
            camera.setPreviewDisplay(holder);
        } 
        catch (Exception e) 
        {
            this.releaseCamera();
        }
    }

    /*
     * (non-Javadoc)
     * @see android.view.SurfaceHolder.Callback#surfaceChanged(android.view.SurfaceHolder, int, int, int)
     */
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) 
    {
        // Start the preview for surfaceChanged
        if (camera != null)
        {
            camera.startPreview();
        }
    }

    /*
     * (non-Javadoc)
     * @see android.view.SurfaceHolder.Callback#surfaceDestroyed(android.view.SurfaceHolder)
     */
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) 
    {
        // Do not hold the camera during surfaceDestroyed - view should be gone
        this.releaseCamera();
    }

    /**
     * Important HotFix for Google Glass (post-XE11) update
     * @param camera Object
     */
    public void setCameraParameters(Camera camera)
    {
        if (camera != null)
        {
            Parameters parameters = camera.getParameters();
            parameters.setPreviewFpsRange(30000, 30000);
            camera.setParameters(parameters);   
        }
    }

    /**
     * Release the camera from use
     */
    public void releaseCamera() 
    {
        if (camera != null) 
        {
            camera.release();
            camera = null;
        }
    }
}

Upvotes: 2

Related Questions