2012-09-24 7 views
12

Ich habe ein seltsames Problem in meiner Kamera App, wenn mit Galaxie Nexus getestet ... Es stürzt einfach ab, wenn versuchen, die Kameraaktivität zu starten .. Aber es funktioniert gut mit fast allen anderen Geräten .. Diese meine Funktionen sind .....Kameraunfall unerwartet in Galaxie Nexus

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

Kann jemand mir helfen?

+4

Setzen Sie die Ausnahme/Crash-Logcat auch. –

+0

@AdilSoomro Entschuldigung..aber ich habe es jetzt nicht .. ich habe nicht das Nexus-Telefon auch .. – hacker

+0

wahrscheinlich Becoz Sie starten und stoppen Kamera in SurfaceChanged. Es ist besser, startPreview in onResume() und stopPreview in onPause(). Es funktioniert für meine Anwendung über Galaxie Nexus. –

Antwort

11

schließlich bekam ich die Antwort ... Nexus hat sowohl Front-und Back-End-Kameras.So das Problem war der Code, der zum Öffnen der Kamera (muss die Kamera-ID für die Front-End-Kamera einstellen) und auch wir müssen Stellen Sie die entsprechende Vorschaugröße ein. Hier ist der modifizierte Code ..

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