0

数日前から、アプリケーションの CAMERA モジュールを使用しています。ハードウェアに組み込まれたモバイル カメラをインテントで呼び出す代わりに、完全なカメラ モジュールをカスタマイズしました。シャッター、画像などにコールバックを使用しました。このカスタマイズされたカメラにズームとオートフォーカス機能を追加しようとしています。マニフェスト ファイルに記載されている必要なアクセス許可と共に、ZOOM および AUTO-FOCUS 機能を追加する方法を誰か教えてください。

4

2 に答える 2

6

私の終わりからのいくつかの観察。

1) Camera.autoFocusは1回限りの呼び出しであり、 Camera.getParameters.getFocusMode()FOCUS-MODE-AUTOまたは の場合に適用さFOCUS-MODE-MACROれます。それ以外の場合は、 autoFocusメソッドを呼び出す必要はありません。APIドキュメントを参照し、熱心にフォローしてください。

2)AutoFocusCallback 1回限りの呼び出しとは、このメソッドがインスタンスを登録して通知を継続的に受信しないことを意味し ます。

3)むしろ、FOCUS-MODE-AUTO動的で連続的なフォーカス定数ではありません。代わりに、使用および構築しているAPIレベルとSDKバージョンに応じて使用FOCUS-MODE-EDOFする ことをお勧めします。FOCUS-MODE-CONTINUOUS-PICTURES

4)実際のデバイスカメラがまたはFOCUS-MODEなどの定数をサポートしていない可能性があり ます。カメラパラメータを作成するときは、該当する定数を確認し て使用するようにしてください。EDOFINFINITEgetSupportedFocusModes

5)camera.autoFocus直前に呼び出す とcamera.takePicture、結果のjpeg-byte-arrayがPictureCallBack元のサイズより少なくとも50%大きく膨らむ可能性があります。autoFocus()明示的に呼び出さないと、前autoFocus()のファイルが非常に低い解像度で終了し、jpeg-byte-arrayの長さがわずか10Kバイトになり、からの画像ビットマップがnullになる場合がありますBitmapFactory

6)オートフォーカスの許可については、APIドキュメントを参照してください。

7)ズームに関しては、オートフォーカス機能の実装ほど複雑ではありません。スライダーなどの画面の相互作用、またはボリュームキーなどのハードウェアキーに応じて、からインスタンスを受信するとすぐににZoomChangeListener 登録できるを実装できます。CameraCameraopen(int cameraId)

于 2012-03-26T18:36:39.510 に答える
3

ズーム (2x) の場合:

   Camera.Parameters parameters = camera.getParameters();
   parameters.set("zoom", "2.0");
   parameters.set("taking-picture-zoom", "20");

API レベル > 5 の場合は、setZoom()などの API を使用します。

オートフォーカス用 (zxing から取得)

public final boolean onKeyDown(int keyCode, KeyEvent event) {

synchronized(this) {
if (!bIsPictureTaking) {

    if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_CAMERA)    {

            if (!bIsPictureTaking && !bIsAutoFocusStarted){

                YourAutoFocusCallback autoFocusCallBack = new YourAutoFocusCallback();

                camera.autoFocus(autoFocusCallBack);

.

final class YourAutoFocusCallback implements Camera.AutoFocusCallback {


  private static final long AUTOFOCUS_INTERVAL_MS = 1500L;

  private final CameraConfigurationManager configManager;
  private boolean reinitCamera;
  private Handler autoFocusHandler;
  private int autoFocusMessage;

  AutoFocusCallback(CameraConfigurationManager configManager) {
    this.configManager = configManager;
  }

  void setHandler(Handler autoFocusHandler, int autoFocusMessage) {
    this.autoFocusHandler = autoFocusHandler;
    this.autoFocusMessage = autoFocusMessage;
  }

  public void onAutoFocus(boolean success, Camera camera) {
    if (autoFocusHandler != null) {
      Message message = autoFocusHandler.obtainMessage(autoFocusMessage, success);
      autoFocusHandler.sendMessageDelayed(message, AUTOFOCUS_INTERVAL_MS);
      autoFocusHandler = null;

        configManager.setDesiredCameraParameters(camera);
    } else {
     }
  }

}
于 2011-09-22T10:19:00.823 に答える