2012-03-16 9 views
23

E 'possibile catturare un'immagine senza mostrare l'anteprima della fotocamera ?, ho il requisito che dovrei essere in grado di catturare l'immagine da una discussione o da un servizio, senza disturbare l'applicazione in primo piano, dove non voglio mostrare l'anteprima della fotocamera, ma voglio comunque catturare l'immagine sullo sfondo e memorizzarla nel dispositivocome prendere l'acquisizione della fotocamera senza un'anteprima da un servizio o un thread?

+2

Hai visto queste altre domande? http://stackoverflow.com/questions/2386025/android-camera-without-preview http://stackoverflow.com/questions/7398897/how-to-use-camera-to-take-picture-in-a-background -service-on-android –

+0

qualsiasi programma di esempio per utilizzare la fotocamera frontale senza anteprima e salvare la scheda SD – city0666

risposta

12

Prova questo codice. Farà clic su un'immagine all'avvio dell'attività. Ha un'anteprima, ma la dimensione dell'anteprima è impostata su 0 per 0 dp.

package fortyonepost.com.pwop; 

import java.io.IOException; 

import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.hardware.Camera; 
import android.hardware.Camera.Parameters; 
import android.os.Bundle; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.widget.ImageView; 

public class TakePicture extends Activity implements SurfaceHolder.Callback 
{ 
    //a variable to store a reference to the Image View at the main.xml file 
    private ImageView iv_image; 
    //a variable to store a reference to the Surface View at the main.xml file 
    private SurfaceView sv; 

    //a bitmap to display the captured image 
    private Bitmap bmp; 

    //Camera variables 
    //a surface holder 
    private SurfaceHolder sHolder; 
    //a variable to control the camera 
    private Camera mCamera; 
    //the camera parameters 
    private Parameters parameters; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     //get the Image View at the main.xml file 
     iv_image = (ImageView) findViewById(R.id.imageView); 

     //get the Surface View at the main.xml file 
     sv = (SurfaceView) findViewById(R.id.surfaceView); 

     //Get a surface 
     sHolder = sv.getHolder(); 

     //add the callback interface methods defined below as the Surface View callbacks 
     sHolder.addCallback(this); 

     //tells Android that this surface will have its data constantly replaced 
     sHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) 
    { 
     //get camera parameters 
     parameters = mCamera.getParameters(); 

     //set camera parameters 
     mCamera.setParameters(parameters); 
     mCamera.startPreview(); 

     //sets what code should be executed after the picture is taken 
     Camera.PictureCallback mCall = new Camera.PictureCallback() 
     { 
      @Override 
      public void onPictureTaken(byte[] data, Camera camera) 
      { 
       //decode the data obtained by the camera into a Bitmap 
       bmp = BitmapFactory.decodeByteArray(data, 0, data.length); 
       //set the iv_image 
       iv_image.setImageBitmap(bmp); 
      } 
     }; 

     mCamera.takePicture(null, null, mCall); 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) 
    { 
     // The Surface has been created, acquire the camera and tell it where 
     // to draw the preview. 
     mCamera = Camera.open(); 
     try { 
      mCamera.setPreviewDisplay(holder); 

     } catch (IOException exception) { 
      mCamera.release(); 
      mCamera = null; 
     } 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) 
    { 
     //stop the preview 
     mCamera.stopPreview(); 
     //release the camera 
     mCamera.release(); 
     //unbind the camera from this object 
     mCamera = null; 
    } 
} 

di riferimento: http://www.41post.com/3794/programming/android-take-a-picture-without-displaying-a-preview

+0

Questo è sulla traccia corretta, ma si sta utilizzando un 'Activity' piuttosto che un thread o un servizio in background. – Sam

+0

Questo scatta una foto, ma è ruotata di 90 gradi! Per verificare, ho reso la vista di superficie 200x200 pixel invece di 0 larghezza. La vista di superficie mostra anche l'immagine lateralmente. – Raja

1

è possibile utilizzare un manichino surfaceholder.callback

private SurfaceHolder.Callback dummySurfaceCallback = new SurfaceHolder.Callback() 
{ 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) 
    { 
     // do nothing 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) 
    { 
     // do nothing 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) 
    { 
     // do nothing 
    } 
}; 

e applicarlo a un surfaceholder (previewHolder)

preview = (SurfaceView) findViewById(R.id.preview); 
    previewHolder = preview.getHolder(); 
    previewHolder.addCallback(dummySurfaceCallback); 
    previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

e quindi utilizzare il previewholder nella configurazione di previewdisplay in mediarecoreder.

mediaRecorder.setPreviewDisplay(previewHolder.getSurface()); 

questo metodo avrà un'anteprima schermata nera. questo funziona per me, spero che questo possa essere d'aiuto ...

3

Non ho potuto accettare risposta per lavorare all'interno della mia attività principale (ha funzionato come attività separata quando ho cambiato la vista di superficie a 1 dpi per 1 dpi, ma dopo aver preso foto, le mie viste dinamiche scomparirebbero).

per scattare foto senza anteprima nella mia attività principale, ho utilizzato il codice da Android - Take picture without preview (la versione modificata segue).

...

private SurfaceView sv; 
Camera myCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT); 

...

private void takePhoto() { 

     Camera.Parameters parameters = myCamera.getParameters(); 
     // myCamera.setDisplayOrientation(180); 
     // parameters.setPictureFormat(ImageFormat.JPEG); 
     // parameters.setPictureFormat(PixelFormat.JPEG); 
     myCamera.setParameters(parameters); 
     SurfaceView mview = sv; 
     try { 
      myCamera.setPreviewDisplay(mview.getHolder()); 
      myCamera.startPreview(); 
      myCamera.takePicture(null, null, photoCallback); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    Camera.PictureCallback photoCallback=new Camera.PictureCallback() { 
     public void onPictureTaken(byte[] data, Camera camera) { 

      saveMyPhotoToParse(data); 
      // Log.i(DEBUG_TAG,"image pseudo saved"); 
     } 
    }; 
+1

eccezione puntatore nullo su questa riga myCamera.setPreviewDisplay (mview.getHolder()); –

1

Effettuare l'anteprima all'interno di un'altra disposizione lineare e modificare l'alfa valori 255 pieno trasparente 0 piena opaco

cameraPreview_holderLL.setAlpha (255); // abilita l'anteprima

cameraPreview_holderLL.setAlpha (0 // disabilita l'anteprima

<LinearLayout 
    android:id="@+id/camera_preview_holder" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 
     <LinearLayout 
      android:id="@+id/camera_preview" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      android:orientation="vertical" > 
     </LinearLayout> 
</LinearLayout> 
Problemi correlati