2011-06-01 7 views
12

Fotoğraf makinesiyle çekilen resimlere ihtiyaç duyan bir uygulama yazıyorum. Gerçek bir fotoğraf çekmeye çalıştığımda sorun ortaya çıkıyor. İşte beni rahatsız eden kod:PictureCallback.onPictureTaken hiç çağrılmadı

final ShutterCallback shutterCallback = new ShutterCallback() { 
     @Override 
     public void onShutter() { 
      Log.d(TAG, "onShutter"); 
     } 
    }; 

    final PictureCallback callback = new PictureCallback() { 

     @Override 
     public void onPictureTaken(byte[] data, Camera camera) { 
      Log.d(TAG, "onPictureTaken - jpeg"); 
      try { 
       //async task for storing the photo 
       new SavePhotoTask(CameraView.this.ctx, data).execute(); 
      } catch (final SavePhotoException e) { 
       //some exceptionhandling 
      } 
     } 
    }; 
    this.camera = Camera.open(); 
    this.camera.setPreviewDisplay(surfaceHolder); 
    final Camera.Parameters parameters = findBestParameters(w, h); 
    this.camera.setParameters(parameters); 
    this.camera.startPreview(); 
    Log.d(TAG, "takePicture now!"); 
    this.camera.takePicture(shutterCallback, null, callback); 

emülatörü üzerinde dışarı iş gibi görünüyor ama Telefonuma (Motorola Defy - android 2.1).

Asıl sorun: telefonda hiçbir zaman "onPictureTaken" olmuyor. Shuttercallback yürütülür, ancak diğeri değildir (ve jpeg yerine aynı şeyle denedim).

Bu problemi bilen var mı? Farkın şu anda emülatörün nerede olduğunu göremiyorum. Yardımın için minnettarım.

cevap

15

Sonunda sorunu giderdim ve hata ayıkladım. Birdenbire işe yaradı, çünkü hata ayıklama çok daha yavaş: Zamanlama problemi. Geri aramanın çağrılması biraz zaman alır. Telefonun hatalarını ayıklamak, fotoğraf çekmeyi bitirmek için yeterli zamana sahipti ...

Ayrıca çok erken Camera.stopPreview() ve Camera.release() arama.

+0

İsa Bunu okumadan önce wtf'nin problem olduğunu bilmeden çok fazla saat kaybettim. Teşekkürler! –

+0

muhtemelen bana hata ayıklama çaba günlerini kurtardı – buster

+1

benim için çalıştı, stopPreview() çok yakında – Sudara

10

Bu kesin sorunu yaşıyordum. Çok fazla hata ayıklamadan sonra, aptal Kamera nesnesinin geri aramaları arama şansı olmadan önce çöp topladığını fark ettim!

Kullanmakta olduğum Kamera nesnesine sabit bir başvuru oluşturarak onu çözdüm. Bunu PictureTaker sınıfımın bir üyesi haline getirdim, takePicture() öğesini çağırmadan önce ayarladım ve verileri aldıktan sonra jpeg geri aramada null olarak ayarlayın. Sonra sadece benim PictureTaker nesnesinin gc'd'ye sahip olmamasını sağlamalıyım, bunu uygulama alt sınıfımda işlemin ömrü boyunca saklıyorum.

Bu her zaman benim Droid RAZR çalışır:

public class PictureTaker implements Camera.PictureCallback 
{ 
    private Camera mCam; 
    private MyApp theApp; 

    public PictureTaker(MyApp app) 
    { 
    theApp = app; 
    } 

    public void takePicture() 
    { 
    try 
    { 
     mCam = Camera.open(); 
    } 
    catch (Exception e) 
    { 
     System.out.println("Problem opening camera! " + e); 
     return; 
    } 

    if (mCam == null) 
    { 
     System.out.println("Camera is null!"); 
     return; 
    } 

    try 
    { 
     SurfaceView view = MyApp.getPreviewSurface(); // my own fcn 
     mCam.setPreviewDisplay(view.getHolder()); 
     mCam.startPreview(); 
     mCam.takePicture(null, null, this); 
    } 
    catch (Exception e) 
    { 
     System.out.println("Problem taking picture: " + e); 
    } 
    } 

    public void onPictureTaken(byte[] data, Camera cam) 
    { 
    theApp.jpegPictureData(data); // also my own fcn 

    cam.stopPreview(); 
    cam.release(); 

    mCam = null; 
    } 
} 
+0

Uzun zamandır bu uygulamaya bakmadım, ama bu benim sorunum olabilirdi. Paylaşım için teşekkürler :) – Yashima

+0

Bir referans tutmazsanız gc fotoğrafını çektiğinizde kamera beni güldürdü! –

0

belirli bir cihazda picturetaken çağrısı yapmıyor, Benim durumumda. Sorun, kameranın iki kez OnResume() ve oncreate() üzerinde açılmasından kaynaklandı.