2014-04-13 14 views
6

Sử dụng API camera, tôi có thể chụp ảnh thành công và lưu vào thư mục. Dưới đây là đoạn code mà tôi đang sử dụng:Chụp ảnh trong android cứ sau 5 giây

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" /> 

Một lớp helper:

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 
     } 
    } 

} 

Hoạt động Class:

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; 
    } 

} 

Tôi cũng thêm vào tệp kê khai như sau:

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

Tôi có vấn đề sau:

Tôi muốn làm như sau:

  1. Sau khi nhấn nút chụp, tôi muốn máy ảnh tự động tiếp tục chụp ảnh mỗi 5 giây, bằng cách sử dụng một đếm ngược bộ đếm thời gian. Vì vậy, tôi đã thêm những điều sau đây:

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

Tuy nhiên, tôi không còn nhận được một bức tranh. Tôi thêm vào trong khi (true) để làm cho mã lặp lại bởi nó không. Tôi đã thử nó mà không có thời gian (đúng) và như mong đợi việc chụp ảnh bị trì hoãn trong 5 giây

Điều thứ hai là: Làm cách nào để thay đổi chất lượng của ảnh chụp?

Mọi trợ giúp sẽ được đánh giá cao.

+0

Xin chào người dùng2262955, bạn có thể đặt một mẫu làm việc này lên github không? thnaks – Amir

Trả lời

2

Xóa while(true), bạn không cần nó và sẽ tạo bộ đếm thời gian đếm ngược không giới hạn.

Thay đổi Đếm ngược của bạn bắt đầu này

new CountDownTimer(5000,1000){ 

    @Override 
    public void onFinish() { 

    } 

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

}.start(); 

onTick được gọi mỗi 1000 ms trong trường hợp này, và onFinish được gọi khi đồng hồ đếm ngược kết thúc.

Nếu bạn muốn lặp lại điều gì đó sau mỗi 5 giây, tôi không nghĩ rằng CountDownTimer phù hợp với nhu cầu của bạn ... một Timer sẽ tốt hơn.

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

Nhắc nhở để lưu Timer instace để dừng lại!

+0

Không hoạt động. Tôi chỉ nhận được một hình ảnh – user2262955

+1

Có thể vì chụp thêm ảnh, trước tiên bạn nên gọi startPreview().- Xem câu trả lời được cập nhật. –

+0

Chưa hoạt động với bộ hẹn giờ trước đây. Tôi nhận được Nguồn không tìm thấy: Tệp đính kèm nguồn không chứa nguồn cho tệp 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(); 
} 

Bạn cần chụp ảnh khi onTick được gọi, chứ không phải khi gọi onFinish. onTick sẽ được gọi sau mỗi 10 giây (tức là khoảng thời gian được chỉ định), trong khi onFinish sẽ được gọi khi kết thúc countDownTimer. Đây là lý do bạn chỉ nhận được một hình ảnh.

Các vấn đề liên quan