2010-01-07 5 views
1

Tous, j'ai googlé encore et encore pour trouver une solution et tandis que j'ai trouvé un bug concernant la libération de la caméra, etc. Je ne peux pas pour la vie de moi semble obtenir le code de cam travailler. Chaque fois que j'exécute takePicture, le système se bloque simplement, parfois il appelle le PictureCallback, mais la plupart du temps il se bloque.Android Moto Droid caméra se bloque à chaque fois onTakePicture

problèmes étranges de ne pas être en mesure de lire les fichiers /data/ap_gain.bin, etc

Voici le code:

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

J'ai le même problème avec un Nexus One. J'entends le bruit de l'obturateur, puis rien. Dans le journal de débogage, je vois "AudoHardware pcm lecture va en veille". Des progrès pour vous? –

Répondre

0

Une fois que vous JpegPictureCallback est appelé, vous devez appeler mCamera .startPreview à nouveau.

L'exemple d'appareil photo API ne contient pas suffisamment d'informations pour vraiment écrire une application de caméra, mais vous pouvez obtenir ici le code source de la propre application de caméra de Google. Camera.java contient beaucoup d'importance, le code utile:

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

1

Vous prenez parfois une photo et parfois , parce que vous relâchez la caméra avant que le rappel ne se produise.

Lorsque le rappel se déclenche, selon que l'appareil photo s'est déclenché ou non, il pourra ou ne pourra pas accéder à la photo prise.

Je suggère de m'assurer que vous ne relâchez pas l'appareil photo ou que vous ne fermez pas le formulaire lorsque vous prenez une photo.

Mieux encore, fermez le formulaire à partir du rappel photo.

De même, lorsqu'une photo est prise, l'action par défaut d'android est d'arrêter la prévisualisation. Ce n'est pas un bug, mais la nature attendue.