2012-09-24 7 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

Exception/Crash logcatも入れてください。 –

+0

@AdilSoomro申し訳ありません。残念ながら今は持っていません。ネクサスの携帯電話も持っていません。 – hacker

+0

おそらくあなたが始まって、surfaceChangedでカメラを止めています。 onPause()のonResume()とstopPreview()のプレビューの方が良いです。銀河系のネクサス上のアプリケーションのために働いています。 –

答えて

11

最後に私は答えを得ました.Nexusにはフロントエンドとバックエンドの両方のカメラがあります。問題は、カメラを開くために使用されたコード(フロントエンドカメラのカメラIDを設定する必要があります)適切なプレビューサイズを設定します。

@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; 
      } 
関連する問題