Android Moto Droid相机在每次拍摄照片时都会挂起

Android Moto Droid相机在每次拍摄照片时都会挂起,android,camera,Android,Camera,总之,我一次又一次地在谷歌上寻找解决方案,虽然我发现了一个关于相机发布等的bug,但我似乎一辈子都无法让cam代码正常工作。每次我执行takePicture时,系统都会挂起,有时它会调用PictureCallback,但大多数时候它只是挂起 无法读取/data/ap\u gain.bin文件等奇怪问题 下面是代码: public class CameraActivity extends Activity implements Camera.PictureCallback, RequestCons

总之,我一次又一次地在谷歌上寻找解决方案,虽然我发现了一个关于相机发布等的bug,但我似乎一辈子都无法让cam代码正常工作。每次我执行takePicture时,系统都会挂起,有时它会调用
PictureCallback
,但大多数时候它只是挂起

无法读取/data/ap\u gain.bin文件等奇怪问题

下面是代码:

public class CameraActivity extends Activity implements Camera.PictureCallback, RequestConstants {

 private static final String TAG = "Camera";

 private Preview preview;

 private boolean previewRunning;

 private int addressNotificationId;

 @Override
 protected void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  addressNotificationId = getIntent().getIntExtra(REQ_RA_ID, 0);

  getWindow().setFormat(PixelFormat.TRANSLUCENT);
  requestWindowFeature(Window.FEATURE_NO_TITLE);
  getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

  if (preview == null) {
   preview = new Preview(this);
  }
  setContentView(preview);
 }

 @Override
 protected void onDestroy() {
  if (isFinishing()) {
   preview.cleanup();
  }

  super.onDestroy();
 }

 @Override
 public boolean onKeyDown(int keyCode, KeyEvent event) {
  if (keyCode == KeyEvent.KEYCODE_CAMERA) {

   /*
   preview.setDrawingCacheEnabled(true);
   Bitmap ss = preview.getDrawingCache();
   byte[] data = ImageUtility.getImageData(ss,75,1);
   Log.v(TAG, "Pic with size: " + data.length);

   ApplicationManager.getInstance().createPacketRecord(PacketConstants.PT_FLAG_ADDRESS_PHOTO, ApplicationDatabaseManager.getInstance().getRouteAddressBySystemId(addressNotificationId), data);
   finish();
   */
   preview.getCamera().takePicture(new Camera.ShutterCallback() {
    @Override
    public void onShutter() {

    }
   }, null, this);
   return true;
  }
  return super.onKeyDown(keyCode, event);
 }

 @Override
 public void onPictureTaken(byte[] data, Camera camera) {
  /*
  if (data == null || isFinishing())
   return;

  camera.stopPreview();
  previewRunning = false;
  camera.release();
  */
  //Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,data.length);
  //data = null;
  //data = ImageUtility.getImageData(bitmap, 75,1);

  Log.v(TAG, "Pic with size: " + data.length);


  ApplicationManager.getInstance().createPacketRecord(PacketConstants.PT_FLAG_ADDRESS_PHOTO, ApplicationDatabaseManager.getInstance().getRouteAddressBySystemId(addressNotificationId), data);
  finish();
 }

}

class Preview extends SurfaceView implements SurfaceHolder.Callback {
    SurfaceHolder mHolder;
    Camera mCamera;

    Preview(Context context) {
        super(context);

        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed.
        mHolder = getHolder();

        mHolder.addCallback(this);
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    Camera getCamera() {
     return mCamera;
    }

    void cleanup() {
     mCamera.stopPreview();
        mCamera.release();
        mCamera = null;
    }

    public void surfaceCreated(SurfaceHolder holder) {
        if (mCamera == null)
         mCamera = Camera.open();

        try {
           mCamera.setPreviewDisplay(holder);
        } catch (IOException exception) {
            mCamera.release();
            mCamera = null;
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder) {

    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        Camera.Parameters parameters = mCamera.getParameters();
        parameters.setPreviewSize(w, h);
        parameters.setPictureSize(w, h);
        mCamera.setParameters(parameters);
        mCamera.startPreview();
    }

}

调用JpegPictureCallback后,需要再次调用mCamera.startPreview

API摄像头示例中没有足够的信息来真正编写摄像头应用程序,但是您可以在这里获得谷歌自己的摄像头应用程序的源代码。java包含许多重要、有用的代码:


git://android.git.kernel.org/platform/packages/apps/Camera.git

调用JPEG PictureCallback后,需要再次调用mCamera.startPreview

API摄像头示例中没有足够的信息来真正编写摄像头应用程序,但是您可以在这里获得谷歌自己的摄像头应用程序的源代码。java包含许多重要、有用的代码:


git://android.git.kernel.org/platform/packages/apps/Camera.git

您有时在拍照,有时不拍照,因为您在回调发生之前释放了相机

当回调启动时,取决于相机是否已释放,它将或将无法访问拍摄的照片

我建议你拍照时不要松开相机或关闭表格

更好的是,从照片回调中关闭表单


此外,当拍摄照片时,android的默认操作是停止预览。这不是一个bug,而是预期的性质。

您有时正在拍照,有时不拍照,因为您在回调发生之前释放相机

当回调启动时,取决于相机是否已释放,它将或将无法访问拍摄的照片

我建议你拍照时不要松开相机或关闭表格

更好的是,从照片回调中关闭表单


此外,当拍摄照片时,android的默认操作是停止预览。这不是一个bug,而是预期的特性。

我对Nexus One也有同样的问题。我听到快门声,然后什么也没听到。在调试日志中,我看到“AudoHardware pcm播放将进入待机状态”。你有什么进展吗?Nexus One也有同样的问题。我听到快门声,然后什么也没听到。在调试日志中,我看到“AudoHardware pcm播放将进入待机状态”。你有什么进展吗?