没有按钮的Android相机图像捕获

时间:2013-01-07 03:25:07

标签: android android-layout android-camera surfaceview

好的我一直无法实现能够在不按下按钮的情况下拍摄图像的相机应用程序。目前是一个有效的相机应用程序,但下面的代码被注释掉了:

buttonClick = (Button) findViewById(R.id.buttonClick);

buttonClick.setOnClickListener(new OnClickListener() {
  public void onClick(View v) { // <5>
    (1)    preview.camera.takePicture(shutterCallback, rawCallback, jpegCallback);
  }
});*/

并替换为只调用(1)的循环,预览永远不可见并导致应用程序关闭。预览课程如下:

import java.io.IOException;
import android.content.Context;
import android.hardware.Camera;
import android.hardware.Camera.PreviewCallback;

import android.util.Log;

import android.view.SurfaceHolder;

import android.view.SurfaceView;

class Preview extends SurfaceView implements SurfaceHolder.Callback { // 

  <1>
    private static final String TAG = "Preview";

  SurfaceHolder mHolder;  // <2>
  public Camera camera; // <3>

  Preview(Context context) {
    super(context);

    // Install a SurfaceHolder.Callback so we get notified when the
    // underlying surface is created and destroyed.
    mHolder = getHolder();  // <4>
    mHolder.addCallback(this);  // <5>
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // <6>
  }

  // Called once the holder is ready

  public void surfaceCreated(SurfaceHolder holder) {  // <7>
    // The Surface has been created, acquire the camera and tell it where
    // to draw.
    camera = Camera.open(); // <8>
    try {
      camera.setPreviewDisplay(holder);  // <9>

      camera.setPreviewCallback(new PreviewCallback() { // <10>
        // Called for each frame previewed
        public void onPreviewFrame(byte[] data, Camera camera) {  // <11>
          Log.d(TAG, "onPreviewFrame called at: " + System.currentTimeMillis());
          Preview.this.invalidate();  // <12>
        }
      });
    } catch (IOException e) { // <13>
      e.printStackTrace();
    }
  }

  // Called when the holder is destroyed
  public void surfaceDestroyed(SurfaceHolder holder) {  // <14>
    camera.stopPreview();
    camera = null;
  }

  // Called when holder has changed
  public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { // <15>
    camera.startPreview();
  } 

}

有关从何处开始以及为何会发生这种情况的任何想法?

2 个答案:

答案 0 :(得分:1)

如果您只是循环标记为(1)的行,那么您将导致UI线程阻塞。在您被邀请强制关闭您的应用之前,它永远无法更新预览,或者确实对UI执行任何其他操作。

如果您的目标是使用相机拍摄常规快照,则需要使用单独的线程来触发实际拍摄的照片:例如触发UI线程定期回调的任务。

可能符合您目的的代码示例(就在非ui线程上提供计时器而言)是here

如果您想要做其他事情,那么您需要描述目标。

更新: 因为您想要使用如此长的时间间隔拍照,所以您需要使用AlarmManager。有一个tutorialrelevant other question

您需要创建一个拍摄照片的活动,然后设置警报管理器以每24小时触发一次该活动。 使用警报管理器意味着Android本身将负责它是否处于睡眠模式,您不必担心您的应用程序被销毁,如果您在自己的线程中运行计时器将会终止计时器。

答案 1 :(得分:0)

确定。我得到了你的要求。您应该只需尝试使用AlarmManager来提醒您选择的时间。虽然该服务将调用,但您必须实现代码才能从相机获取Capture Image。

您可以将通常适用于任何相机应用程序的代码放入捕获图像。

在呼叫闹钟时调用该代码(调用您的服务)。

希望你明白我的观点。

随意发表评论。