Search code examples
imagecameraoverlayframeimplementation

Set Live Frame on Camera Capturing Image Android (Error)


I got an error when I implemented this code below. I got an error on CameraActivity.java (please see my picture attachment) anyone can fix this?

this is CameraActivity.java

public class CameraActivity extends AppCompatActivity 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 ActionBar.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.cameraoverlay);

        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 ActionBar.LayoutParams(ActionBar.LayoutParams.FILL_PARENT, ActionBar.LayoutParams.FILL_PARENT);

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

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

    CameraSource.PictureCallback cameraPictureCallbackRaw = new CameraSource.PictureCallback()
    {
        @Override
        public void onPictureTaken(byte[] bytes) {

        }


        public void onPictureTaken(byte[] data, Camera camera)
        {
            // TODO Auto-generated method stub
        }
    };

    CameraSource.PictureCallback cameraPictureCallbackJpeg = new CameraSource.PictureCallback()
    {
        @Override
        public void onPictureTaken(byte[] bytes) {

        }


        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.frame);
            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;
    }}

this is an error on CameraActivity.java

This is cambutton.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: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 cameraoverlay.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/frame" />
</LinearLayout>

Hope anyone can fix this code... I compile with android studio 3.0.1


Solution

  • Yes I can Fix,

    I have Same Error, You Need to Import Right Camera Class(hardware.camera) , You implement Graphics class that's why.

    Remove Camera Obj and re write And Select hardware.camera.