2012-09-24 13 views
12

गैलेक्सी नेक्सस के साथ परीक्षण किए जाने पर मेरे कैमरे ऐप में एक अजीब समस्या है .. यह कैमरा गतिविधि शुरू करने का प्रयास करते समय बस दुर्घटनाग्रस्त हो जाता है .. लेकिन यह लगभग सभी अन्य उपकरणों के साथ ठीक काम करता है .. ये मेरे कार्य हैं .....कैमरा क्रैश अप्रत्याशित रूप से गैलेक्सी नेक्सस

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
// TODO Auto-generated method stub 

    try { 
     camera = Camera.open(); 
     camera.setPreviewDisplay(holder); 

    Camera.Parameters parameters = camera.getParameters(); 
     if (Integer.parseInt(Build.VERSION.SDK) >= 8) 
      setDisplayOrientation(camera, 90); 
     else 
      parameters.set("orientation", "portrait"); 
     parameters.setPictureFormat(PixelFormat.JPEG); 
     camera.setParameters(parameters); 



    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IllegalArgumentException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 


} 
@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, 
    int height) { 
// TODO Auto-generated method stub 
if(previewing){ 
    camera.stopPreview(); 
    previewing = false; 
} 

if (camera != null){ 
    try { 


    camera.setPreviewDisplay(surfaceHolder); 
    camera.startPreview(); 
    previewing = true; 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 
} 
} 

किसी को भी मेरी मदद कर सकते ?

+4

अपवाद/क्रैश लॉगकैट भी रखें। –

+0

@AdilSoomro क्षमा करें .. दुर्भाग्यवश मेरे पास अब यह नहीं है .. मेरे पास नेक्सस फोन भी नहीं है .. – hacker

+0

शायद बीकोज़ आप सतह पर कैमरे को शुरू और रोक रहे हैं। शुरू करने के लिए बेहतर है रेज़्यूम() में पूर्वावलोकन करें और रोकें() में रोकें। यह गैलेक्सी नेक्सस पर मेरे आवेदन के लिए काम कर रहा है। –

उत्तर

11

अंत में मुझे जवाब मिला .. नेक्सस के सामने और पीछे दोनों कैमरे हैं। इसलिए समस्या यह थी कि कैमरा खोलने के लिए इस्तेमाल किया गया कोड (फ्रंट एंड कैमरा के लिए कैमरा आईडी सेट करने की आवश्यकता है) और हमें भी इसकी आवश्यकता है उचित पूर्वावलोकन आकार सेट करें .. यहां संशोधित कोड है ..

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, 
    int height) { 



    List<Size> sizes = parameters.getSupportedPreviewSizes(); 
    Size optimalSize = getOptimalPreviewSize(sizes, width, height); 
    parameters.setPreviewSize(optimalSize.width, optimalSize.height); 

    camera.setParameters(parameters); 
    camera.startPreview(); 
    startPreview(); 

} 


    @Override 
public void surfaceCreated(SurfaceHolder holder) { 


    try { 

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { 
       Camera.CameraInfo info=new Camera.CameraInfo(); 

       for (int i=0; i < Camera.getNumberOfCameras(); i++) { 
       Camera.getCameraInfo(i, info); 

       if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
        camera=Camera.open(i); 
        defaultCameraId = i; 
       } 
       } 
      } 

      if (camera == null) { 
       camera=Camera.open(); 
      } 




      try { 
       camera.setPreviewDisplay(surfaceHolder); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      Camera.Parameters parameters = camera.getParameters(); 
      android.hardware.Camera.CameraInfo info = 
        new android.hardware.Camera.CameraInfo(); 
      android.hardware.Camera.getCameraInfo(defaultCameraId, info); 
      int rotation = this.getWindowManager().getDefaultDisplay() 
        .getRotation(); 
      if (Integer.parseInt(Build.VERSION.SDK) >= 8) 
      { 

       int degrees = 0; 
       switch (rotation) { 
        case Surface.ROTATION_0: 
         degrees = 0; break; 
        case Surface.ROTATION_90: 
         degrees = 90; break; 
        case Surface.ROTATION_180: 
         degrees = 180; break; 
        case Surface.ROTATION_270: 
         degrees = 270; break; 
       } 
       int result; 
       if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
        result = (info.orientation + degrees) % 360; 
        result = (360 - result) % 360; 
       } else { // back-facing 
        result = (info.orientation - degrees + 360) % 360; 
       } 
       camera.setDisplayOrientation(result); 

      } 
      else 
      { 
       parameters.set("orientation", "portrait"); 
      } 


      camera.setParameters(parameters); 



    } catch (IllegalArgumentException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 


} 


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

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

       int targetHeight = h; 


       for (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 (Size size : sizes) { 
         if (Math.abs(size.height - targetHeight) < minDiff) { 
          optimalSize = size; 
          minDiff = Math.abs(size.height - targetHeight); 
         } 
        } 
       } 
       return optimalSize; 
      } 
संबंधित मुद्दे