4

写真を撮って電話に保存するために、アンドロイドのカメラコードに取り組んでいます。携帯電話のカメラから写真を撮り、メモリカードに保存します。唯一の問題は、写真を撮った後にカメラのプレビューが再起動しないことです。

解決策がわかりません。コードは次のとおりです。提案が必要です。. . 私のプロジェクトには 2 つのクラスがあります。. .

カメラアクティビティ クラス

public class CameraActivity extends Activity 
{

  private static final String TAG = "CameraDemo";
  Preview preview; 
  Button buttonClick; 

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    preview = new Preview(this); 
    ((FrameLayout) findViewById(R.id.preview)).addView(preview); 

    buttonClick = (Button) findViewById(R.id.buttonClick);
    buttonClick.setOnClickListener(new OnClickListener() {
      public void onClick(View v) { 
        preview.camera.takePicture(shutterCallback, rawCallback, jpegCallback);    
      }
    });

    Log.d(TAG, "onCreate'd");
  }

  // Called when shutter is opened
  ShutterCallback shutterCallback = new ShutterCallback() { 
    public void onShutter() {
      Log.d(TAG, "onShutter'd");
    }
  };

  // Handles data for raw picture
  PictureCallback rawCallback = new PictureCallback() {
    public void onPictureTaken(byte[] data, Camera camera) {
      Log.d(TAG, "onPictureTaken - raw");
    }
  };

  // Handles data for jpeg picture
  PictureCallback jpegCallback = new PictureCallback() { 
    public void onPictureTaken(byte[] data, Camera camera) {
      FileOutputStream outStream = null;
      try {
        // Write to SD Card
        outStream = new FileOutputStream(String.format("/sdcard/DCIM/queries.jpg",
            System.currentTimeMillis()));
        outStream.write(data);
        outStream.close();
        Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length);
      } catch (FileNotFoundException e) { 
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      } finally {
      }
      Log.d(TAG, "onPictureTaken - jpeg");

    }
  };

}

クラスのプレビュー

class Preview extends SurfaceView implements SurfaceHolder.Callback{ 
  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.Parameters parameters = camera.getParameters();
        parameters.set("orientation", "landscape");
        camera.setParameters(parameters);
        camera.setPreviewDisplay(holder);  

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

  }

  // Called when the holder is destroyed
  public void surfaceDestroyed(SurfaceHolder holder) { 
    //Log.d(TAG,"Stopping preview in SurfaceDestroyed().");
    camera.setPreviewCallback(null);
    camera.stopPreview();
    camera.release();
    camera = null;           
  }

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

}
4

3 に答える 3

12

Android APIガイドのカメラに関する記事にも、同じ問題があります。次のようなものをさらに2つ追加することで、写真を撮った後にプレビューを取り戻すことができます。

1)ファイルに外部ストレージ権限を追加しAndroidManifest.xmlます。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2)を呼び出して、プレビューを再開しcamera.startPreview()ます。あなたのコードでは:

...
Log.d(TAG, "onPictureTaken - jpeg");
camera.startPreview();
....

あなたも同じようにあなたを働かせることができると確信しています。

于 2012-06-26T14:35:00.257 に答える
2

次のように onPictureTaken で CAMERAACTIVITY を再度開始します。

// Handles data for jpeg picture
  PictureCallback jpegCallback = new PictureCallback() { 
    public void onPictureTaken(byte[] data, Camera camera) {
      FileOutputStream outStream = null;
      try {
        // Write to SD Card
        outStream = new FileOutputStream(String.format("/sdcard/DCIM/queries.jpg",
            System.currentTimeMillis()));
        outStream.write(data);
        outStream.close();
        Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length);
      } catch (FileNotFoundException e) { 
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      } finally {
        camera.release();
        camera = null;
        startActivity(new Intent(CAMERAACTIVITY.this, CAMERAACTIVITY.class));
        finish();
      }
      Log.d(TAG, "onPictureTaken - jpeg");

    }
  };

必要に応じて、Thread.sleep(2000); も使用できます。そのため、キャプチャされた画像が 2 秒間表示され、その後再びカメラ アクティビティが開始されます。

于 2012-06-06T11:27:56.277 に答える
0

Thread.Sleep(2000) を追加します。camera.startPreview();

カメラがキャプチャした画像を 2 秒間表示し、カメラを再起動します。

于 2014-04-23T11:01:12.840 に答える