2010-01-07 1 views
1

Все, я снова и снова искал Google, чтобы найти решение, и пока я обнаружил ошибку в выпуске камеры и т. Д. Я не могу, чтобы жизнь меня, похоже, получила код камеры работать. Каждый раз, когда я выполнял takePicture, система просто зависает, иногда она вызывает PictureCallback, но большую часть времени она просто зависает.Android Moto Droid Camera Hangs КАЖДЫЙ время onTakePicture

Странные вопросы о не в состоянии читать /data/ap_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(); 
    } 

} 
+0

У меня такая же проблема с Nexus One. Я слышу звук затвора, а потом ничего. В журнале отладки я вижу, что «AudoHardware pcm воспроизведение переходит в режим ожидания». Любой прогресс для вас? –

ответ

0

После того, как вас называют JpegPictureCallback, вам нужно позвонить mCamera .startПодробнее.

В образце камеры API недостаточно информации, чтобы действительно написать приложение для камеры, но здесь вы можете получить исходный код для собственного приложения для камеры Google. Camera.java содержит много важных, полезных код:

мерзавца: //android.git.kernel.org/platform/packages/apps/Camera.git

1

Вы иногда съемки, а иногда нет , потому что вы отпускаете камеру до того, как произошел обратный вызов.

Когда срабатывает обратный вызов, в зависимости от того, была ли камера выпущена или нет, она будет или не сможет получить доступ к снятой фотографии.

Я предлагаю убедиться, что вы не отпускаете камеру или закрываете форму при съемке.

Еще лучше, закройте форму из обратного вызова фотографии.

Кроме того, при снятии фотографии по умолчанию андроид должен остановить предварительный просмотр. это не ошибка, а ожидаемый характер.