2014-04-13 23 views
6

Utilizzando l'API della fotocamera, sono in grado di scattare una foto con successo e salvarla in una cartella. Ecco il codice che sto usando:Scattare foto in Android ogni 5 secondi

main.xml:

<FrameLayout 
     android:id="@+id/camera_preview" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_weight="1" /> 

    <Button 
     android:id="@+id/button_capture" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:text="Capture" /> 

una classe di supporto:

import java.io.IOException; 

import android.content.Context; 
import android.hardware.Camera; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

public class CameraPreview extends SurfaceView implements 
     SurfaceHolder.Callback { 
    private SurfaceHolder mSurfaceHolder; 
    private Camera mCamera; 

    // Constructor that obtains context and camera 
    @SuppressWarnings("deprecation") 
    public CameraPreview(Context context, Camera camera) { 
     super(context); 
     this.mCamera = camera; 
     this.mSurfaceHolder = this.getHolder(); 
     this.mSurfaceHolder.addCallback(this); 
     this.mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder surfaceHolder) { 
     try { 
      mCamera.setPreviewDisplay(surfaceHolder); 
      mCamera.setDisplayOrientation(90); 
      mCamera.startPreview(); 
     } catch (IOException e) { 
      // left blank for now 
     } 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) { 
     mCamera.stopPreview(); 
     mCamera.release(); 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder surfaceHolder, int format, 
      int width, int height) { 
     // start preview with new settings 
     try { 
      mCamera.setPreviewDisplay(surfaceHolder); 
      mCamera.startPreview(); 
     } catch (Exception e) { 
      // intentionally left blank for a test 
     } 
    } 

} 

Attività Classe:

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

import android.os.Bundle; 
import android.os.Environment; 
import android.app.Activity; 
import android.hardware.Camera; 
import android.hardware.Camera.PictureCallback; 
import android.util.Log; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Button; 
import android.widget.FrameLayout; 

public class MyCamera extends Activity { 
    private Camera mCamera; 
    private CameraPreview mCameraPreview; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     mCamera = getCameraInstance(); 
     mCameraPreview = new CameraPreview(this, mCamera); 
     FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview); 
     preview.addView(mCameraPreview); 

     Button captureButton = (Button) findViewById(R.id.button_capture); 
     captureButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mCamera.takePicture(null, null, mPicture); 
      } 
     }); 
    } 

    /** 
    * Helper method to access the camera returns null if it cannot get the 
    * camera or does not exist 
    * 
    * @return 
    */ 
    private Camera getCameraInstance() { 
     Camera camera = null; 
     try { 
      camera = Camera.open(); 
     } catch (Exception e) { 
      // cannot get camera or does not exist 
     } 
     return camera; 
    } 

    PictureCallback mPicture = new PictureCallback() { 
     @Override 
     public void onPictureTaken(byte[] data, Camera camera) { 
      File pictureFile = getOutputMediaFile(); 
      if (pictureFile == null) { 
       return; 
      } 
      try { 
       FileOutputStream fos = new FileOutputStream(pictureFile); 
       fos.write(data); 
       fos.close(); 
      } catch (FileNotFoundException e) { 

      } catch (IOException e) { 
      } 
     } 

    }; 

    private static File getOutputMediaFile() { 
     File mediaStorageDir = new File(
       Environment 
         .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), 
       "MyCameraApp"); 
     if (!mediaStorageDir.exists()) { 
      if (!mediaStorageDir.mkdirs()) { 
       Log.d("MyCameraApp", "failed to create directory"); 
       return null; 
      } 
     } 
     // Create a media file name 
     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss") 
       .format(new Date()); 
     File mediaFile; 
     mediaFile = new File(mediaStorageDir.getPath() + File.separator 
       + "IMG_" + timeStamp + ".jpg"); 

     return mediaFile; 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.my_camera, menu); 
     return true; 
    } 

} 

Ho anche aggiunto a il file manifest il seguente:

<uses-feature android:name="android.hardware.camera" /> 
    <uses-permission android:name="android.permission.CAMERA" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

ho i seguenti problemi:

voglio fare quanto segue:

  1. Dopo aver premuto il pulsante di acquisizione, voglio che la fotocamera di continuare automaticamente catturare immagini ogni 5 secondi, utilizzando un conto alla rovescia. Così ho aggiunto il seguente:

    while(true){ 
        new CountDownTimer(5000,1000){ 
    
          @Override 
          public void onFinish() { 
           mCamera.takePicture(null, null, mPicture); 
          } 
    
          @Override 
          public void onTick(long millisUntilFinished) { 
    
          } 
    
         }.start(); 
    } 
    

Tuttavia, non sono più di ottenere una foto. Ho aggiunto il tempo (true) per far sì che il codice non si ripetesse. L'ho provato senza tempo (vero) e come previsto l'acquisizione dell'immagine è ritardata per 5 secondi

La seconda cosa è: come posso cambiare la qualità delle immagini acquisite?

Qualsiasi aiuto sarà molto apprezzato.

+0

Ciao utente2262955, puoi inserire un esempio funzionante di questo su github? thnaks – Amir

risposta

2

Rimuovere il while(true), non è necessario e creerà timer di conto alla rovescia illimitati.

Cambia il tuo conto alla rovescia inizia a questo

new CountDownTimer(5000,1000){ 

    @Override 
    public void onFinish() { 

    } 

    @Override 
    public void onTick(long millisUntilFinished) { 
     mCamera.startPreview(); 
     mCamera.takePicture(null, null, mPicture); 
    } 

}.start(); 

onTick è chiamato ogni 1000 ms in questo caso, e onFinish è chiamato quando il conto alla rovescia è finito.

Se si desidera ripetere qualcosa ogni 5 secondi non credo che uno CountDownTimer soddisfi le proprie esigenze ... uno Timer sarebbe meglio.

Timer timer = new Timer(); 
timer.schedule(new TimerTask() 
{ 
    @Override 
    public void run() 
    { 
     mCamera.startPreview(); 
     mCamera.takePicture(null, null, mPicture); 
    } 
}, 0, 1000); 

Ricorda per salvare Timer instace per fermarlo!

+0

Non funziona. Ricevo solo una foto – user2262955

+1

Forse perché per scattare più foto dovresti prima chiamare startPreview().- Vedi la risposta aggiornata. –

+0

Non ho mai lavorato con il timer. Ricevo l'origine non trovata: l'allegato di origine non contiene la fonte per il file Timer.class – user2262955

0
while (true) { 
    new CountDownTimer(5000, 1000) { 
     @Override 
     public void onFinish() { 
      releaseCamera(); 
     } 

     @Override 
     public void onTick(long millisUntilFinished) { 
      mCamera.takePicture(null, null, mPicture); 
     } 

     }.start(); 
} 

il necessario per catturare immagini quando onTick viene chiamato, non quando onFinish si chiama. onTick verrà chiamato ogni volta dopo 10 secondi (vale a dire l'intervallo specificato), mentre onFinish verrà chiamato una volta countDownTimer finiture. Questo è il motivo per cui ottieni solo un'immagine.