2012-03-24 37 views
6

我已經創建了我自己的相機應用程序。當我點擊按鈕時,它會拍攝照片並將其保存在星系中。我想要做的就是在沒有預覽的情況下拍照並且不點擊任何按鈕。構建我自己的相機應用程序+自動捕捉圖像

我的主要活動課。

package themiya.camera.android; 

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

import android.app.Activity; 
import android.content.Context; 
import android.content.pm.PackageManager; 
import android.hardware.Camera; 
import android.hardware.Camera.PictureCallback; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.provider.MediaStore; 
import android.view.View; 
import android.widget.Button; 
import android.widget.FrameLayout; 
import android.widget.Toast; 

public class CameraActivity extends Activity { 

private Camera mCamera; 
private CameraPreview mPreview; 
public static final int MEDIA_TYPE_IMAGE = 1; 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    Button captureButton = (Button) findViewById(R.id.button_capture); 
    System.out.println("Starting!"); 

    // Create an instance of Camera 
    mCamera = getCameraInstance(); 
    // Create our Preview view and set it as the content of our activity. 
    mPreview = new CameraPreview(this, mCamera); 
    FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview); 
    preview.addView(mPreview); 

    final PictureCallback mPicture = new PictureCallback() { 

     public void onPictureTaken(byte[] data, Camera camera) { 

      File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE); 

      if (pictureFile == null){ 
       return; 
      } 

      try { 
       FileOutputStream fos = new FileOutputStream(pictureFile); 
       fos.write(data); 
       fos.close(); 
       MediaStore.Images.Media.insertImage(getContentResolver(), pictureFile.getAbsolutePath(), pictureFile.getName(), pictureFile.getName()); 
      } catch (FileNotFoundException e) { 

      } catch (IOException e) { 

      } 
      } 
     }; 





    // Add a listener to the Capture button 
     captureButton.setOnClickListener(

      new View.OnClickListener() { 

       public void onClick(View v) { 
        // get an image from the camera 

        System.out.println("Photo Taking!"); 
        mCamera.takePicture(null, null, mPicture); 



       } 
      } 
     ); 




} 




/** A safe way to get an instance of the Camera object. */ 
public static Camera getCameraInstance(){ 
    Camera c = null; 
    try { 
     c = Camera.open(); // attempt to get a Camera instance 
    } 
    catch (Exception e){ 
     // Camera is not available (in use or does not exist) 
    } 
    return c; // returns null if camera is unavailable 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    releaseCamera();    // release the camera immediately on pause event 
} 



private void releaseCamera(){ 
    if (mCamera != null){ 
     mCamera.release();  // release the camera for other applications 
     mCamera = null; 
    } 
} 



/** Create a File for saving an image or video */ 
private File getOutputMediaFile(int type){ 
    // To be safe, you should check that the SDCard is mounted 
    // using Environment.getExternalStorageState() before doing this. 

    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
       Environment.DIRECTORY_PICTURES), "MyCameraApp"); 


    // This location works best if you want the created images to be shared 
    // between applications and persist after your app has been uninstalled. 

    // Create the storage directory if it does not exist 
    if (! mediaStorageDir.exists()){ 
     if (! mediaStorageDir.mkdirs()){ 
      return null; 
     } 
    } 

    // Create a media file name 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    File mediaFile; 
    if (type == MEDIA_TYPE_IMAGE){ 
     mediaFile = new File(mediaStorageDir.getPath() + File.separator + 
     "IMG_"+ timeStamp + ".jpg"); 
    } else { 
     return null; 
    } 

    return mediaFile; 
} 
} 

和預覽類。

package themiya.camera.android; 

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 mHolder; 
    private Camera mCamera; 

    public CameraPreview(Context context,Camera camera) { 
     super(context); 
     mCamera = camera; 

     /*SurfaceView view = new SurfaceView(this); 
     c.setPreviewDisplay(view.getHolder()); 
     c.startPreview(); 
     c.takePicture(shutterCallback, rawPictureCallback, jpegPictureCallback); 
     * */ 

     // Install a SurfaceHolder.Callback so we get notified when the 
     // underlying surface is created and destroyed. 
     mHolder = getHolder(); 

     mHolder.addCallback(this); 
     // deprecated setting, but required on Android versions prior to 3.0 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 


    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
      int height) { 
     // TODO Auto-generated method stub 

     if (mHolder.getSurface() == null){ 
      // preview surface does not exist 
      return; 
      } 

      // stop preview before making changes 
      try { 
       mCamera.stopPreview(); 
      } catch (Exception e){ 
      // ignore: tried to stop a non-existent preview 
      } 

      // set preview size and make any resize, rotate or 
      // reformatting changes here 

      // start preview with new settings 
      try { 
       mCamera.setPreviewDisplay(mHolder); 
       mCamera.startPreview(); 

      } catch (Exception e){ 

      } 

    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 

    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 

    } 

} 

在活動類中的點擊方法是這樣的。

captureButton.setOnClickListener(

      new View.OnClickListener() { 

       public void onClick(View v) { 
         // get an image from the camera 

        System.out.println("Photo Taking!"); 
        mCamera.takePicture(null, null, mPicture); 



       } 
      } 
     ); 

當我刪除該監聽部分,並將僅

mCamera.takePicture(null, null, mPicture); 

部分應用程序崩潰。我認爲這可能是由於應用程序用於打開相機的延遲。因此,在打開相機之前,代碼嘗試獲取照片。還等一下(10000);沒有爲我工作。

而且我還想拍照而沒有預覽。根據我的知識,我必須改變預覽課程來做到這一點。但我不知道正確的做法。

任何人都可以幫助我這個ASP。

+0

好的我發現了一個答案自動進行拍攝.... 最終計時器t =新定時器(); \t t.schedule(新的TimerTask(){ \t \t \t \t \t \t \t \t @Override \t \t \t \t公共無效的run(){ mCamera.takePicture(NULL,NULL,mPicture); \t \t \t \t \t t.cancel(); \t \t \t \t} \t \t \t},5000); 現在我想停止預覽... – MoraRockey 2012-03-24 16:41:04

回答

0

好吧,我找到了一個答案,自動拍照。添加爲其他人使用的評論。

final Timer t = new Timer(); 
t.schedule(new TimerTask() { 
@Override 
public void run() { 
mCamera.takePicture(null, null, mPicture); t.cancel(); 
} 
},5000); 
5

訣竅是給Camera類一個SurfaceView,它不是視圖層次結構的一部分。下面的代碼是從我的應用程序,其中我用這種技術來顯示自己

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     if (mCamera != null) { 
      mCamera.stopPreview(); 
      mCamera.release(); 
      mCamera = null; 
     } 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     mCamera = Camera.open(); 
     startPreview(); 
    } 

    private void startPreview() { 
      if (mCamera != null) { 
       mCamera.stopPreview(); 
       try { 
        mCamera.setPreviewDisplay(new SurfaceView(this).getHolder()); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       mCamera.setPreviewCallbackWithBuffer(this); 

       Camera.Parameters parameters = mCamera.getParameters();  
       parameters.setPreviewSize(IMAGE_W, IMAGE_H); 
       mCamera.setParameters(parameters); 
       PixelFormat p = new PixelFormat(); 
       PixelFormat.getPixelFormatInfo(parameters.getPreviewFormat(), p); 
       int bufSize = (IMAGE_W * IMAGE_H * p.bitsPerPixel)/8; 
       mCamera.addCallbackBuffer(new byte[bufSize]); 
       mCamera.startPreview(); 
      } 
     } 
    public void onPreviewFrame(final byte[] data, Camera camera) { 
     if (mCamera == null) { 
      return; 
     } 
     mCamera.addCallbackBuffer(data); 
    } 
} 
-1

其簡單的創建另一個方法與10000的延時,完成預覽,那麼你會做的活動定時器變量之一。邏輯是這些方法將在定時器1活動完成後運行5秒。

相關問題