0

I have the next code, actually I have a main layer that shows the camera preview, and 2 layouts called R.layout.overlay and R.layout.controls, the layout of controls only show a button that take a picture, and the overlay have an image, what I try to do is that at the moment I take the picture the image that is in R.layout.overlay appear on the capture of the photo. At the moment of preview before taking the photo it displays controls an image fine. I don't know how to do this cause when I take the picture it takes it but without the image on R.layout.overlay. Or is there a way to take an screenshot with some code? thats other option I have been thinking, but the problem of this is that the photo will be of the size of the resolution of the screen.

This is my code:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

        getWindow().setFormat(PixelFormat.UNKNOWN);
        surfaceView = (SurfaceView)findViewById(R.id.camerapreview);
        surfaceHolder = surfaceView.getHolder();
        surfaceHolder.addCallback(this);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        drawingView = new DrawingView(this);
        LayoutParams layoutParamsDrawing 
            = new LayoutParams(LayoutParams.FILL_PARENT, 
                    LayoutParams.FILL_PARENT);
        this.addContentView(drawingView, layoutParamsDrawing);

        controlInflater = LayoutInflater.from(getBaseContext());
        View viewControl = controlInflater.inflate(R.layout.control, null);
        LayoutParams layoutParamsControl = new LayoutParams(LayoutParams.FILL_PARENT, 
                    LayoutParams.FILL_PARENT);
        this.addContentView(viewControl, layoutParamsControl);

        inflater = LayoutInflater.from(getBaseContext());
         View view = inflater.inflate(R.layout.overlay, null);
         LayoutParams layoutParamsControl2= new LayoutParams(LayoutParams.FILL_PARENT, 
                 LayoutParams.FILL_PARENT);
         this.addContentView(view, layoutParamsControl2);

        buttonTakePicture = (Button)findViewById(R.id.takepicture);
        buttonTakePicture.setOnClickListener(new Button.OnClickListener(){

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                camera.takePicture(myShutterCallback, myPictureCallback_RAW, myPictureCallback_JPG);
            }});

        LinearLayout layoutBackground = (LinearLayout)findViewById(R.id.background);
        layoutBackground.setOnClickListener(new LinearLayout.OnClickListener(){

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub

                buttonTakePicture.setEnabled(false);
                camera.autoFocus(myAutoFocusCallback);
            }});

        prompt = (TextView)findViewById(R.id.prompt);
    }


    //Termina onCreate

    FaceDetectionListener faceDetectionListener
    = new FaceDetectionListener(){

        @Override
        public void onFaceDetection(Face[] faces, Camera camera) {

            if (faces.length == 0){
                prompt.setText(" No Face Detected! ");
                drawingView.setHaveFace(false);
            }else{
                prompt.setText(String.valueOf(faces.length) + " Face Detected :) ");
                drawingView.setHaveFace(true);
                detectedFaces = faces;
            }

            drawingView.invalidate();

        }};

    AutoFocusCallback myAutoFocusCallback = new AutoFocusCallback(){

        @Override
        public void onAutoFocus(boolean arg0, Camera arg1) {
            // TODO Auto-generated method stub
            buttonTakePicture.setEnabled(true);
        }};

    ShutterCallback myShutterCallback = new ShutterCallback(){

        @Override
        public void onShutter() {
            // TODO Auto-generated method stub

        }};

    PictureCallback myPictureCallback_RAW = new PictureCallback(){

        @Override
        public void onPictureTaken(byte[] arg0, Camera arg1) {
            // TODO Auto-generated method stub

        }};

    PictureCallback myPictureCallback_JPG = new PictureCallback(){

        @Override
        public void onPictureTaken(byte[] arg0, Camera arg1) {
            // TODO Auto-generated method stub
            /*Bitmap bitmapPicture 
                = BitmapFactory.decodeByteArray(arg0, 0, arg0.length);  */

            Uri uriTarget = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, new ContentValues());

            OutputStream imageFileOS;
            try {
                imageFileOS = getContentResolver().openOutputStream(uriTarget);
                imageFileOS.write(arg0);
                imageFileOS.flush();
                imageFileOS.close();

                prompt.setText("Image saved: " + uriTarget.toString());

                Toast.makeText(AndroidCamera.this, "Saved", Toast.LENGTH_LONG).show();

            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            camera.startPreview();
            camera.startFaceDetection();
        }};

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        // TODO Auto-generated method stub
        if(previewing){
            camera.stopFaceDetection();
            camera.stopPreview();
            previewing = false;
        }

        if (camera != null){
            try {
                camera.setPreviewDisplay(surfaceHolder);
                camera.startPreview();

                prompt.setText(String.valueOf(
                        "Max Face: " + camera.getParameters().getMaxNumDetectedFaces()));
                camera.startFaceDetection();
                previewing = true;
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        camera = Camera.open();
        camera.setFaceDetectionListener(faceDetectionListener);
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        camera.stopFaceDetection();
        camera.stopPreview();
        camera.release();
        camera = null;
        previewing = false;
    }

    private class DrawingView extends View{

        boolean haveFace;
        Paint drawingPaint;

        public DrawingView(Context context) {
            super(context);
            haveFace = false;
            drawingPaint = new Paint();
            drawingPaint.setColor(Color.GREEN);
            drawingPaint.setStyle(Paint.Style.STROKE); 
            drawingPaint.setStrokeWidth(2);
        }

        public void setHaveFace(boolean h){
            haveFace = h;
        }

        @Override
        protected void onDraw(Canvas canvas) {
            // TODO Auto-generated method stub
            if(haveFace){

                // Camera driver coordinates range from (-1000, -1000) to (1000, 1000).
                 // UI coordinates range from (0, 0) to (width, height).

                 int vWidth = getWidth();
                 int vHeight = getHeight();

                for(int i=0; i<detectedFaces.length; i++){

                    int l = detectedFaces[i].rect.left;
                    int t = detectedFaces[i].rect.top;
                    int r = detectedFaces[i].rect.right;
                    int b = detectedFaces[i].rect.bottom;
                    int left    = (l+1000) * vWidth/2000;
                    int top     = (t+1000) * vHeight/2000;
                    int right   = (r+1000) * vWidth/2000;
                    int bottom  = (b+1000) * vHeight/2000;
                    canvas.drawRect(
                            left, top, right, bottom,  
                            drawingPaint);
                }
            }else{
                canvas.drawColor(Color.TRANSPARENT);
            }
        }

    }
Lain
  • 2,166
  • 4
  • 23
  • 47
Aagrlp640
  • 70
  • 1
  • 7

1 Answers1

0

You can take a screenshot of your phone by physically pressing a combination of buttons. Thus, I guess there should be a way to do this programmatically, probably by overriding a callback somewhere. Check here: How to programmatically take a screenshot in Android?

But remember that when you are taking the screenshot, the image will have the same resolution of the phone display, and on old devices it may be very low. A picture taken with the camera will have a far better resolution. You can still add your image on the picture taken by simply merging the two images together.

Community
  • 1
  • 1
type-a1pha
  • 1,891
  • 13
  • 19