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スレッドでタイマーを提供するという点で)あなたの目的に役立つコードの例はここにあります

何か他のことをしたい場合は、目標を説明する必要があります。

更新: 写真を撮るためにこのような長い時間のギャップを使用したいので、AlarmManagerを使用する必要があります。チュートリアル関連する他の質問があります。

写真を撮るアクティビティを作成し、24 時間ごとにそのアクティビティをトリガーするようにアラーム マネージャーを設定する必要があります。アラーム マネージャーを使用すると、Android 自体がスリープ モードかどうかを処理します。アプリが破棄されることを心配する必要はありません。独自のスレッドでタイマーを実行している場合、タイマーが強制終了されます。

于 2013-01-07T04:11:51.777 に答える
0

Ok。ご要望を承りました。選択した時間を思い出させるAlarmManagerを試してみる必要があります。そして、そのサービスが呼び出される間、カメラからキャプチャ画像を取得するためのコードを実装する必要があります。

画像をキャプチャするために、通常はどのカメラアプリでも機能するコードを配置できます。

アラームが呼び出されている間にそのコードを呼び出すだけです(サービスが呼び出されます)。

あなたが私の主張を理解してくれることを願っています。

コメントはお気軽に。

于 2013-01-07T04:31:54.940 に答える