Autore Topic: Camera Surface View problema con takePicture(...)  (Letto 914 volte)

Offline kiuzhack

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Google+
    • kiuzhack
    • Mostra profilo
    • Kiuz
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Mac OSx
Camera Surface View problema con takePicture(...)
« il: 28 Dicembre 2012, 12:10:01 CET »
0
Salve a tutti, sto smanettando da un po' con la Camera Surface View per l'acquisizione di immagini da fotocamera. Fino a questo momento son riuscito ad far comparire la preview, qui di dargli le giuste proporzioni ecc...
Quindi impostato un bottone che quando cliccato richiama takePicture(... ) per l'acquisizione dell'immagine e conseguente salvataggio non ancora implementato.

Sorge un problema che non son riuscito a venirne a capo, se tra i parametri della fotocamera imposto il flash a ON, esso funziona correttamente infatti viene attivato solo quando richiamo takePicture, ma l'immagine "che si fissa" nella preview è appena precedente al flash e quindi l'immagine catturata non è illuminata da quest'ultimo.

Mi sapete dire il perchè? mi pare di aver letto che devo usare ShutterCallback.onShot() ... ma non capisco come  far attendere la preview a catturare l'immagine illuminata dal flash.....

Codice
Codice (Java): [Seleziona]
package it.kiuz.simplecamera;

import android.os.Bundle;
import android.os.Environment;
import android.annotation.TargetApi;
import android.app.Activity;
import android.graphics.PixelFormat;
import android.graphics.Point;
import android.view.Menu;
import android.view.SurfaceHolder;
import android.view.Window;
import android.view.WindowManager;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.Size;
import android.os.Bundle;
import android.util.Log;
import android.view.Display;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.ImageButton;

@TargetApi(13)
public class Shot extends Activity implements SurfaceHolder.Callback {

    private SurfaceHolder holder;

    // private static final int IMAGE_WIDTH = 384;
    // private static final int IMAGE_HEIGHT = 384;
    // private static final String ORIENTATION = "orientation";
    // private static final String ROTATION = "rotation";
    // private static final String PORTRAIT = "portrait";
    // private static final String LANDSCAPE = "landscape";

    protected static final int CAMERA_REQUEST = 1888;

    /* VARIABILI PRIVATE */
    private SurfaceView mSurfaceView;
    private SurfaceHolder mSurfaceHolder;
    private Camera mCamera;
    private boolean mPreviewRunning;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        getWindow().setFormat(PixelFormat.TRANSLUCENT);
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        // getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
        // WindowManager.LayoutParams.FLAG_FULLSCREEN);

        setContentView(R.layout.activity_shot);

        SurfaceView camera_surface = (SurfaceView) findViewById(R.id.camera_surface);
        camera_surface.getHolder().setFixedSize(300, 300);

        ImageButton buttonPicture = (ImageButton) findViewById(R.id.camera_surface_button);
        buttonPicture.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {

                mCamera.takePicture(null, null, null);
                //new HandlePictureStorage()

            }
        });

        mSurfaceView = (SurfaceView) findViewById(R.id.camera_surface);
        mSurfaceHolder = mSurfaceView.getHolder();

        mSurfaceHolder.addCallback(this);
        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        try {

            this.mCamera = Camera.open();

            mCamera.setDisplayOrientation(90);
            this.mCamera.setPreviewDisplay(holder);

            Parameters params = mCamera.getParameters();
            List<Size> size = params.getSupportedPreviewSizes();
            params.setPreviewSize(size.get(0).width, size.get(0).height);

            SurfaceView camera_surface = (SurfaceView) findViewById(R.id.camera_surface);
            camera_surface.getHolder().setFixedSize(size.get(0).height,
                    size.get(0).width);

            params.setFlashMode(Parameters.FLASH_MODE_AUTO);
            params.setAntibanding(Parameters.ANTIBANDING_AUTO);
            params.setFocusMode(Parameters.FOCUS_MODE_AUTO);

            mCamera.setParameters(params);

            mCamera.startPreview();
            System.out.println("test");
            Iterator<Size> i = size.iterator();
            while (i.hasNext()) {
                Size tmp = i.next();
                System.out.println("A1- " + tmp.height + ":" + tmp.width);
            }

        } catch (IOException ioe) {
            ioe.printStackTrace(System.out);
        }

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        if (mCamera != null) {
            mCamera.stopPreview();
            mCamera.setPreviewCallback(null);
            mCamera.release();
            mCamera = null;
            mPreviewRunning = false;
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {

    }

    private class HandlePictureStorage implements PictureCallback {

        @Override
        public void onPictureTaken(byte[] picture, Camera camera) {

            System.out.println("Picture successfully taken: " + picture);

            String fileName = "shareme.jpg";
            String mime = "image/jpeg";

        }
    }
}
« Ultima modifica: 28 Dicembre 2012, 12:28:44 CET da kiuzhack »