2012-12-01 13 views
7

मैं एक कैमरा ऐप बनाते समय कर रहा हूँ, लेकिन मैं startPreview पर समस्या है, यह मेरे भेजता है:कैमरा startPreview में विफल रहा है

java.lang.RuntimeException: startPreview failed 

यहाँ मेरे कैमरे गतिविधि है:

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; 
    } 
}} 

और यहाँ मेरी है SurfaceView कोड:

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { 
    private static final String TAG = "CameraPreview"; 
    private SurfaceHolder mHolder; 
    private Camera mCamera; 

    public CameraPreview(Context context, Camera camera) { 
     super(context); 
     mCamera = camera; 

     // Install a SurfaceHolder.Callback so we get notified when the 
     // underlying surface is created and destroyed. 
     mHolder = getHolder(); 
     mHolder.addCallback(this); 
     // deprecated setting, but required on Android versions prior to 3.0 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     // The Surface has been created, now tell the camera where to draw the preview. 
     try { 
      mCamera.setPreviewDisplay(holder); 
      mCamera.startPreview(); 

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

    public void surfaceDestroyed(SurfaceHolder holder) { 
     // empty. Take care of releasing the Camera preview in your activity. 
    } 

    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. 

     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 
     Parameters parameters= mCamera.getParameters(); 
     parameters.setPreviewSize(w, h); 
     mCamera.setParameters(parameters); 

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

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

और यहाँ मेरी त्रुटि लॉग है:

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

क्षमा करें, मैं अपने चर नाम बहुत संशय है काम करता है। 'mholder/holder/camera/mcamera/preview/mpreview' जब आप सतही में 'धारक' के बजाय' mholder' का उपयोग करते हैं, और जब 'पूर्वावलोकन' और 'mPreview' विभिन्न वर्गों के उदाहरण होते हैं। मुझे छोड़ना पड़ा, मैं क्रॉससीड जा रहा था! मैं यह नहीं कह सकता कि कोई गलती नहीं है, लेकिन मुझे लगता है कि यदि आप नामों का अधिक लगातार उपयोग करते हैं और शायद उनमें अधिक विवरण के साथ आपको यह आसान लगेगा। शुभ लाभ! – emrys57

+1

हाय वेरिएबल नाम एंड्रॉइड एसडीके उदाहरणों में से एक हैं, लेकिन शायद आप उन्हें बदलने के लिए परेशान होंगे। क्या आपको कोई त्रुटि नहीं दिखाई दे रही है? मैंने बहुत सी चीजों की जांच की है लेकिन मुझे नहीं पता कि अब क्या करना है – user1805792

+0

मैंने कभी भी 'SurfaceView' को 'FrameLayout' में प्रोग्राम नहीं किया है। यह पूरी तरह से सही हो सकता है, लेकिन मैं कुछ आसान से शुरू करूंगा। 'SurfaceView' को सीधे xml फ़ाइल में' camera_layout' पर जोड़ने की तरह, और एक बार जब आप यह काम कर लेंगे, तो लेआउट को अपने रास्ते में बदलें। मुझे नहीं पता कि इससे समस्या ठीक हो जाएगी लेकिन यह डिबगिंग को सरल बना देगा। – emrys57

उत्तर

4

मैं surfaceChanged

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()); 
     } 
    } 

में कुछ लाइनों को हटाने समाधान कर लिया है तो त्रुटि में होना चाहिए मैं इन पंक्तियों में से एक:

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

कोई मुझे समझा सकता है कि उन पंक्तियों में क्या गलत था?

+0

मैंने नीचे उत्तर पोस्ट किया है। – hybrid

4

क्या (डब्ल्यू, एच) आपके कैमरे के लिए एक वैध पूर्वावलोकन आकार है?

आप सभी मान्य पूर्वावलोकन आकार प्राप्त करने के लिए mCamera.getParameters().getSupportedPreviewSizes() का उपयोग कर सकते हैं।

+0

यह संभवतः 'रनटाइम अपवाद' का कारण है। कुछ उपकरणों के लिए, [कैमरा.सेट पैरामीटर()] पर कॉल करें (http://developer.android.com/reference/android/hardware/Camera.html#setParameters (android.hardware.Camera.Parameters)) असमर्थित पूर्वावलोकन आकार के साथ 'रनटाइम अपवाद' का कारण बनता है। दूसरों के लिए, अपवाद [कैमरा पर फेंक दिया गया है।startPreview()] (http://developer.android.com/reference/android/hardware/Camera.html#startPreview()) –

3

इसके देर से, लेकिन किसी के जवाब

चर w और ज की तलाश में है, तो इष्टतम पूर्वावलोकन आकार नहीं हैं। आप समारोह

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; 
    } 

का उपयोग कर इष्टतम पूर्वावलोकन आकार प्राप्त कर सकते हैं और आप उपयोग कर

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

} 
0

मैं इस त्रुटि थी समारोह कॉल कर सकते हैं, और क्योंकि मैं पहली बार onPause पर releaseCamera फोन नहीं किया यह है मैं अपना ऐप शुरू करता हूं।
एक रिबूट के बाद, सब कुछ ठीक ^^

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()); 
    } 
} 
संबंधित मुद्दे