Autore Topic: problema nell'uso della fotocamera frontale  (Letto 1764 volte)

Offline titanum

  • Nuovo arrivato
  • *
  • Post: 47
  • Respect: 0
    • Mostra profilo
problema nell'uso della fotocamera frontale
« il: 24 Luglio 2012, 10:52:18 CEST »
0
Ciao ragazzi, volevo fare in modo che la mia applicazione all'avvio facesse partire la fotocamera frontale per far scattare una serie di foto all'utente.
Se si deve usare la fotocamera si può usare un intent in questo modo:
Codice: [Seleziona]
        Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tmpFotoFile));
        startActivityForResult(cameraIntent, CAMERA_REQUEST);
e poi definire un metodo onActivityResult per fare operazioni con la foto appena scattata. Per la fotocamera frontale, però, pare non si possa fare la stessa cosa, non ho trovato un intent che me la facesse utilizzare. Allora ho provato questo metodo, che seleziona la fotocamera frontale e poi lancia startPreview:

Codice: [Seleziona]
  public void attivaFotocamera(){
               int cameraCount = 0;
                Camera cam = null;
                Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
                cameraCount = Camera.getNumberOfCameras();
                for ( int camIdx = 0; camIdx < cameraCount; camIdx++ ) {
                    Camera.getCameraInfo( camIdx, cameraInfo );
                    if ( cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT  ) {
                        try {
                            cam = Camera.open( camIdx );
                        } catch (RuntimeException e) {
                                throw new RuntimeException("impossibile aprire la fotocamera");
                        }
                    }
                }
                cam.startPreview();
    }

Il problema è che non funziona, questo metodo viene chiamato nel main ma non viene mostrata l'anteprima della fotocamera e non da nessun errore. Sapete dirmi perché? Grazie

Offline DarnellNajanReed

  • Utente normale
  • ***
  • Post: 359
  • Respect: +49
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus One, Acer Iconia A500/501, Asus Transformer Prime, Galaxy ACE, Galaxy S Plus, Galaxy S Advance P, Galaxy Tab 2 7.0, Google Nexus 7
  • Play Store ID:
    Luigi Notaro
  • Sistema operativo:
    OS X 10.8.3
Re:problema nell'uso della fotocamera frontale
« Risposta #1 il: 24 Luglio 2012, 11:33:16 CEST »
0
Come da docu ufficiale:

Citazione
public final void startPreview ()
Starts capturing and drawing preview frames to the screen. Preview will not actually start until a surface is supplied with setPreviewDisplay(SurfaceHolder) or setPreviewTexture(SurfaceTexture).


Offline titanum

  • Nuovo arrivato
  • *
  • Post: 47
  • Respect: 0
    • Mostra profilo
Re:problema nell'uso della fotocamera frontale
« Risposta #2 il: 24 Luglio 2012, 16:21:50 CEST »
0
ho letto che bisogna usare una view di tipo surfaceview, ho modificato il codice basandomi su un esempio, ora è così:

Codice: [Seleziona]
public class FaceRecActivity extends Activity {
        protected static final String TAG = "FaceRecActivity";
    File tmpFotoFile = null;
    byte[] bitmapdata;
        private SurfaceView view;
    private SurfaceHolder viewHolder=null;

    private Camera camera;
        /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        view=(SurfaceView)findViewById(R.id.preview);
        viewHolder=view.getHolder();
        Canvas canvas = new Canvas();
            view.draw(canvas);
            viewHolder.addCallback(surfaceCallback);
            try {
                        camera = selectCamera();
                } catch (IOException e) {
                        throw new RuntimeException("impossibile avviare la fotocamera");
                }
    }
   
    public Camera selectCamera() throws IOException{
               int cameraCount = 0;
               Camera cam = null;
               Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
               cameraCount = Camera.getNumberOfCameras();
               for ( int camIdx = 0; camIdx < cameraCount; camIdx++ ) {
                    Camera.getCameraInfo( camIdx, cameraInfo );
                    if ( cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT  ) {
                        try {
                            cam = Camera.open( camIdx );
                        } catch (RuntimeException e) {
                                throw new RuntimeException("impossibile aprire la fotocamera");
                        }
                    }
                }

                cam.startPreview();
                return cam;
    }
   
    SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback() {
        public void surfaceCreated(SurfaceHolder holder) {
                // The Surface has been created, now tell the camera where to draw the preview.
            try {
                camera.setPreviewDisplay(holder);
                camera.startPreview();
            } catch (IOException e) {
                Log.d(TAG, "Error setting camera preview: " + e.getMessage());
            }
        }
       
        public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {

                if (viewHolder.getSurface() == null){
                // preview surface does not exist
                Log.d(TAG, "mHolder.getSurface() == null");
                return;
            }

            try {
                camera.stopPreview();

            } catch (Exception e){
                // ignore: tried to stop a non-existent preview
                Log.d(TAG, "Error stopping camera preview: " + e.getMessage());
            }

            try {
                camera.setPreviewDisplay(viewHolder);
                camera.startPreview();
                camera.startFaceDetection(); // re-start face detection feature

            } catch (Exception e){
                // ignore: tried to stop a non-existent preview
                Log.d(TAG, "Error starting camera preview: " + e.getMessage());
            }
        }

                @Override
                public void surfaceDestroyed(SurfaceHolder holder) {
                        //non fa nulla
                }
    };
}

in questo modo la view viene visualizzata, ma l'immagine è storta, ovvero se ho lo schermo in verticale l'immagine viene mostrata in orizzontale e viceversa. Cosa devo modificare per visualizzarla correttamente? Inoltre come devo fare per scattare una foto? Grazie.

Offline titanum

  • Nuovo arrivato
  • *
  • Post: 47
  • Respect: 0
    • Mostra profilo
Re:problema nell'uso della fotocamera frontale
« Risposta #3 il: 25 Luglio 2012, 16:21:39 CEST »
0
ho capito come fare per scattare la foto, bisogna inserire un bottone e poi creare un listener che si attiva quando l'utente clicca:
Codice: [Seleziona]
btn.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                    File f = new File("","photo.jpeg");
                    camera.takePicture(null, null, jpegCallback); //una callback di tipo picture calback che implementa il metodo on picturetaken
            }
            });

per quanto riguarda il problema dell'immagine storta, ho letto che dipende dal metodo surfaceChanged, che deve essere in grado di verificare la posizione dello schermo. L'ho riscritto in questo modo:
Codice: [Seleziona]
        public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
            //Log.i(TAG, "Preview: surfaceChanged() - size now " + w + "x" + h);
            // Now that the size is known, set up the camera parameters and begin
            // the preview.
            try {
                Parameters mParameters = camera.getParameters();
                mParameters.set("orientation","landscape");
                for (Integer i : mParameters.getSupportedPreviewFormats()) {
                    //Log.i(TAG, "supported preview format: " + i);
                }

                sizes = mParameters.getSupportedPreviewSizes();
                for (Size size : sizes) {
                    //Log.i(TAG, "supported preview size: " + size.width + "x" + size.height);
                }
                camera.setParameters(mParameters); // apply the changes
            } catch (Exception e) {
                    throw new RuntimeException("errore nel metodo surfaceChanged");
            }

            //updateBufferSize(); // then use them to calculate

            Size p = camera.getParameters().getPreviewSize();
            //Log.i(TAG, "Preview: checking it was set: " + p.width + "x" + p.height); // DEBUG
            camera.startPreview();
        }
tuttavia ancora non funziona, l'immagine viene sempre visualizzata spostata di 90 gradi. Credo che manchi qualcosa che setta le corrette dimensioni quando viene avviata la camera. Come posso risolvere?

Offline leandro87

  • Nuovo arrivato
  • *
  • Post: 1
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Sony Xperia Mini Pro
  • Sistema operativo:
    Windows XP, Mac OS X Lion
Re:problema nell'uso della fotocamera frontale
« Risposta #4 il: 21 Novembre 2012, 18:58:39 CET »
0

[qoute]
in questo modo la view viene visualizzata, ma l'immagine è storta, ovvero se ho lo schermo in verticale l'immagine viene mostrata in orizzontale e viceversa. Cosa devo modificare per visualizzarla correttamente? Inoltre come devo fare per scattare una foto? Grazie.
[/quote]

Hai risolto? perchè anche io ho lo stesso problema ed ho provato di tutto...

Please help