0

好的,我在实现无需按下按钮即可捕获图像的相机应用程序时遇到了麻烦。当前是一个工作的相机应用程序,但是当下面的代码被注释掉时:

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

}

关于从这里去哪里以及为什么会发生这种情况的任何想法?

4

2 回答 2

1

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

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

可以服务于您的目的的代码示例(就在非 ui 线程上提供计时器而言)是here

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

更新:因为您想使用如此长的时间间隔来拍照,所以您需要使用AlarmManager。有一个教程相关的其他问题

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

于 2013-01-07T04:11:51.777 回答
0

好的。我得到了你的要求。您应该只需要尝试使用 AlarmManager 来提醒您选择的时间。虽然该服务会调用,但您必须实现从相机获取捕获图像的代码。

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

只需在调用警报时调用该代码(调用您的服务)。

希望你明白我的意思。

随意评论。

于 2013-01-07T04:31:54.940 回答