2012-12-01 13 views
7

başarısız, beni gönderir: Burada kamera startPreview bir kamera uygulaması oluşturma ama <code>startPreview</code> üzerinde problem

java.lang.RuntimeException: startPreview failed 

benim kamera Aktivite geçerli:

public class CameraActivity extends Activity { 

private Camera mCamera; 
private CameraPreview mPreview; 
private Target_Frame targetFrame; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.camera_layout); 




    mCamera=getCameraInstance(); 
    mPreview=new CameraPreview(this, mCamera); 




    FrameLayout preview=(FrameLayout)findViewById(R.id.camera_preview); 
    preview.addView(mPreview); 

} 




/** Check if this device has a camera only if not specified in the manifest */ 
public boolean checkCameraHardware(Context context) { 
    if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){ 
     // this device has a camera 
     return true; 
    } else { 
     // no camera on this device 
     return false; 
    } 
} 

/** A safe way to get an instance of the Camera object. */ 
public static Camera getCameraInstance(){ 
    Camera c = null; 
    try { 
     c = Camera.open(); // attempt to get a Camera instance 
    } 
    catch (Exception e){ 
     // Camera is not available (in use or does not exist) 
    } 
    return c; // returns null if camera is unavailable 
} 

/**Check if the device has flash*/ 
public boolean checkFlash(Context context){ 
    if(context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)){ 
     //the device has flash 
     return true; 
    }else{ 
     //no flash 
     return false; 
    } 

} 




@Override 
protected void onDestroy() { 
    // TODO Auto-generated method stub 
    super.onDestroy(); 
    releaseCamera(); 
} 




@Override 
protected void onPause() { 
    // TODO Auto-generated method stub 
    super.onPause(); 
    releaseCamera(); 
} 




@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 

    //Test if i have to put all this code like in onCreate 
    if(mCamera!=null){ 
     return; 
    } 
    mCamera=getCameraInstance(); 

    if(mPreview!=null){ 
     return; 
    } 
    mPreview=new CameraPreview(this, mCamera); 
    FrameLayout preview=(FrameLayout)findViewById(R.id.camera_preview); 
    preview.addView(mPreview); 


} 


private void releaseCamera(){ 
    if (mCamera != null){ 
     mCamera.release();  // release the camera for other applications 
     mCamera = null; 
    } 
}} 

Ve işte benim olduğunu SurfaceView kodu:

Ve işte benim hata günlüğü geçerli: Yani hata olmalıdır ben

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
     // If your preview can change or rotate, take care of those events here. 
     // Make sure to stop the preview before resizing or reformatting it. 
     Log.d("Function", "surfaceChanged iniciado"); 
     if (mHolder.getSurface() == null){ 
      // preview surface does not exist 
      return; 
     } 

     // stop preview before making changes 
     try { 
      mCamera.stopPreview(); 
     } catch (Exception e){ 
      // ignore: tried to stop a non-existent preview 
     } 

     // set preview size and make any resize, rotate or 
     // reformatting changes here 


     // start preview with new settings 
     try { 
      mCamera.setPreviewDisplay(mHolder); 
      mCamera.startPreview(); 

     } catch (Exception e){ 
      Log.d(TAG, "Error starting camera preview: " + e.getMessage()); 
     } 
    } 

surfaceChanged

bazı satırları silme çözmüş

12-01 13:17:01.135: E/AndroidRuntime(1161): FATAL EXCEPTION: main 

12-01 13:17:01.135: E/AndroidRuntime(1161): java.lang.RuntimeException: startPreview 

12-01 13:17:01.135: E/AndroidRuntime(1161):  at com.example.prueba.CameraPreview.surfaceCreated(CameraPreview.java:36) 
+0

Üzgünüm, sizin değişken adları korkunç kafa karıştırıcı ince bulmak çalışır. "tutucu" yerine "tutucu" yı kullanırken "tutucu" ve "önizleme" ile "mPreview" farklı sınıfların örnekleri olduğunda "tutucu"/camera/mcamera/preview/mpreview'. Vazgeçmek zorunda kaldım, ben çaprazlaşıyordum! Hata olmadığını söyleyemem, ama isimleri daha tutarlı ve belki de daha fazla açıklamayla kullanmış olsanız bunu daha kolay bulacağınızı düşünüyorum. İyi şanslar! – emrys57

+1

Merhaba değişken isimleri, android sdk örneklerinin aynısıdır, ancak belki de dediğiniz gibi değiştirmek isteyeceğim. Bir hata görmüyor musun? Bir çok şeye bakıyorum ama şimdi ne yapacağımı bilmiyorum – user1805792

+0

Hiçbir zaman bir “SurfaceView” öğesini bir “FrameLayout” içine programlamamıştım. Tamamen doğru olabilir, ancak daha basit bir şeyle başlarım. Xml dosyasındaki "SurfaceView" öğesini doğrudan "camera_layout" öğesine eklemek gibi, ve bu çalışmayı yaptıktan sonra, düzeni burada sahip olduğunuz şekilde değiştirin. Sorunun çözüleceği konusunda hiçbir fikrim yok ama hata ayıklamayı daha basit hale getirecek. – emrys57

cevap

4

ben bu satırlardan birini:

Parameters parameters= mCamera.getParameters(); 
    parameters.setPreviewSize(w, h); 
    mCamera.setParameters(parameters); 

Birisi bana bu hatlarda neyin yanlış olduğunu açıklayabilir mi?

+0

Aşağıdaki cevabı postaladım. – hybrid

4

Kameranız için geçerli bir önizleme boyutu var mı (h, h)?

Geçerli önizleme boyutlarının tümüne ulaşmak için mCamera.getParameters().getSupportedPreviewSizes() kullanabilirsiniz.

+0

Bu büyük olasılıkla 'RuntimeException' nedenidir. Bazı cihazlar için desteklenmeyen önizleme boyutu ile [Camera.setParameters()] 'a (http://developer.android.com/reference/android/hardware/Camera.html#setParameters (android.hardware.Camera.Parameters)) çağrı yapabilirsiniz. RuntimeException neden. Diğerleri için istisna [Kamera.startPreview()] (http://developer.android.com/reference/android/hardware/Camera.html#startPreview()) –

3

Onun geç, ama birileri cevap

değişkenler w ve h arayan eğer optimum önizleme boyutları değildir. Sen fonksiyonunu

public static Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int w, int h) { 
     final double ASPECT_TOLERANCE = 0.1; 
     double targetRatio=(double)h/w; 
     if (sizes == null) return null; 

     Camera.Size optimalSize = null; 
     double minDiff = Double.MAX_VALUE; 

     int targetHeight = h; 

     for (Camera.Size size : sizes) { 
      double ratio = (double) size.width/size.height; 
      if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue; 
      if (Math.abs(size.height - targetHeight) < minDiff) { 
       optimalSize = size; 
       minDiff = Math.abs(size.height - targetHeight); 
      } 
     } 

     if (optimalSize == null) { 
      minDiff = Double.MAX_VALUE; 
      for (Camera.Size size : sizes) { 
       if (Math.abs(size.height - targetHeight) < minDiff) { 
        optimalSize = size; 
        minDiff = Math.abs(size.height - targetHeight); 
       } 
      } 
     } 
     return optimalSize; 
    } 

kullanarak optimum önizleme boyutları alabilir ve bu hata vardı

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
.. 
size=getOptimalPreviewSize(parameters.getSupportedPreviewSizes(), w, h); 
parameters.setPreviewSize(size.getWidth(), size.getHeight()); 
.. 

} 
0

kullanarak işlevini çağırabilirsiniz ve ben ilk kez OnPause üzerinde releaseCamera aramadım çünkü bu kadar Uygulamama başladım. yeniden başlatıldıktan sonra
, her şey ^^

0
public void surfaceCreated(SurfaceHolder holder) { 
    // The Surface has been created, now tell the camera where to draw the preview. 
    try { 
     mCamera.setPreviewDisplay(holder); 
     mCamera.getParameters().getSupportedPreviewSizes(); 
     mCamera.startPreview(); 
     Log.d(TAG, "Camera preview started."); 
    } catch (IOException e) { 
     Log.d(TAG, "Error setting camera preview: " + e.getMessage()); 
    } 
}