2017-02-21 80 views
0

我试图在启动应用程序时打开相机活动。 这意味着,当我启动应用程序时,它将通过前置摄像头捕捉图像。但是,当我启动应用程序时,我遇到了错误。 我实际上试图运行我从github获得的代码;但是,它只是强制重新启动应用程序。相机活动无法正常工作,setParameters失败

E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.androidmyway.demo.capturecameraimage, PID: 5697 
java.lang.RuntimeException: setParameters failed 
    at android.hardware.Camera.native_setParameters(Native Method) 
    at android.hardware.Camera.setParameters(Camera.java:1966) 
    at com.androidmyway.demo.capturecameraimage.CameraView.surfaceChanged(CameraView.java:140) 
    at android.view.SurfaceView.updateWindow(SurfaceView.java:634) 
    at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:161) 
    at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:944) 
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2205) 
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1250) 
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6311) 
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:871) 
    at android.view.Choreographer.doCallbacks(Choreographer.java:683) 
    at android.view.Choreographer.doFrame(Choreographer.java:619) 
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:857) 
    at android.os.Handler.handleCallback(Handler.java:751) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:241) 
    at android.app.ActivityThread.main(ActivityThread.java:6217) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 

CameraView.java

public class CameraView extends Activity implements SurfaceHolder.Callback, OnClickListener{ 
    private static final String TAG = "CameraTest"; 
    Camera mCamera; 
    boolean mPreviewRunning = false; 

    @SuppressWarnings("deprecation") 
    public void onCreate(Bundle icicle){ 
     super.onCreate(icicle); 
     Log.e(TAG, "onCreate"); 

     getWindow().setFormat(PixelFormat.TRANSLUCENT); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     setContentView(R.layout.cameraview); 
     ImageView img = (ImageView) findViewById(R.id.blankImage); 

     if(CaptureCameraImage.isBlack) 
      img.setBackgroundResource(android.R.color.black); 
     else 
      img.setBackgroundResource(android.R.color.white); 

     mSurfaceView = (SurfaceView) findViewById(R.id.surface_camera); 
     mSurfaceView.setOnClickListener(this); 
     mSurfaceHolder = mSurfaceView.getHolder(); 
     mSurfaceHolder.addCallback(this); 
     mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState){ 
     super.onRestoreInstanceState(savedInstanceState); 
    } 


    Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() { 

     public void onPictureTaken(byte[] data, Camera camera) { 
      // TODO Auto-generated method stub 
      if (data != null){ 
       //Intent mIntent = new Intent(); 
       //mIntent.putExtra("image",imageData); 

       mCamera.stopPreview(); 
       mPreviewRunning = false; 
       mCamera.release(); 

       try{ 
        BitmapFactory.Options opts = new BitmapFactory.Options(); 
        Bitmap bitmap= BitmapFactory.decodeByteArray(data, 0, data.length,opts); 
        bitmap = Bitmap.createScaledBitmap(bitmap, 300, 300, false); 
        int width = bitmap.getWidth(); 
        int height = bitmap.getHeight(); 
        int newWidth = 300; 
        int newHeight = 300; 

        // calculate the scale - in this case = 0.4f 
        float scaleWidth = ((float) newWidth)/width; 
        float scaleHeight = ((float) newHeight)/height; 

        // createa matrix for the manipulation 
        Matrix matrix = new Matrix(); 
        // resize the bit map 
        matrix.postScale(scaleWidth, scaleHeight); 
        // rotate the Bitmap 
        matrix.postRotate(-90); 
        Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, 
          width, height, matrix, true); 
        CaptureCameraImage.image.setImageBitmap(resizedBitmap); 

       }catch(Exception e){ 
        e.printStackTrace(); 
       } 
       //StoreByteImage(mContext, imageData, 50,"ImageName"); 
       //setResult(FOTO_MODE, mIntent); 
       setResult(585); 
       finish(); 
      } 
     } 
    }; 

    protected void onResume(){ 
     Log.e(TAG, "onResume"); 
     super.onResume(); 
    } 

    protected void onSaveInstanceState(Bundle outState){ 
     super.onSaveInstanceState(outState); 
    } 

    protected void onStop(){ 
     Log.e(TAG, "onStop"); 
     super.onStop(); 
    } 

    @TargetApi(9) 
    public void surfaceCreated(SurfaceHolder holder){ 
     Log.e(TAG, "surfaceCreated"); 
     mCamera = Camera.open(CaptureCameraImage.cameraID); 
    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
     Log.e(TAG, "surfaceChanged"); 

     // XXX stopPreview() will crash if preview is not running 
     if (mPreviewRunning){ 
      mCamera.stopPreview(); 
     } 

     Camera.Parameters p = mCamera.getParameters(); 
     p.setPreviewSize(300, 300); 

     if(CaptureCameraImage.cameraID == 0){ 
      String stringFlashMode = p.getFlashMode(); 
      if (stringFlashMode.equals("torch")) 
       p.setFlashMode("on"); // Light is set off, flash is set to normal 'on' mode 
      else 
       p.setFlashMode("torch"); 
     } 

     mCamera.setParameters(p); 
     try{ 
      mCamera.setPreviewDisplay(holder); 
     }catch (Exception e){ 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     mCamera.startPreview(); 
     mPreviewRunning = true; 
     mCamera.takePicture(null, mPictureCallback, mPictureCallback); 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     Log.e(TAG, "surfaceDestroyed"); 
     //mCamera.stopPreview(); 
     //mPreviewRunning = false; 
     //mCamera.release(); 
    } 

    private SurfaceView mSurfaceView; 
    private SurfaceHolder mSurfaceHolder; 

    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     mCamera.takePicture(null, mPictureCallback, mPictureCallback); 
    } 

} 

CameraView.java

public class CaptureCameraImage extends Activity { 

    public static int cameraID = 0; 
    public static boolean isBlack = true; 
    public static ImageView image; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activitycapturecameraimage); 
     image = (ImageView) findViewById(R.id.imgView); 
    } 

    public void onFrontClick(View v){ 
     RadioButton rdbBlack = (RadioButton) findViewById(R.id.rdb_black); 
     if(rdbBlack.isChecked()){ 
      isBlack = true; 
     }else{ 
      isBlack = false; 
     } 
     cameraID = 1; 
     Intent i = new Intent(CaptureCameraImage.this,CameraView.class); 
     startActivityForResult(i, 999); 
    } 

    public void onBackClick(View v){ 
     RadioButton rdbBlack = (RadioButton) findViewById(R.id.rdb_black); 
     if(rdbBlack.isChecked()){ 
      isBlack = true; 
     }else{ 
      isBlack = false; 
     } 
     cameraID = 0; 
     Intent i = new Intent(CaptureCameraImage.this,CameraView.class); 
     startActivityForResult(i, 999); 
    } 

} 
+0

当你有错误?是前面还是后面'相机'。 –

+0

嗨,这是前置摄像头 – moon

回答

0

甚至认为一些设备支持arbitory预览尺寸有些则没有。还有你必须这样做,你的surfaceChanged方法

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
    Camera.Parameters param = camera.getParameters(); 
    List<Camera.Size> previewSizes = param.getSupportedPreviewSizes(); 
    Camera.Size ps = // .... select a previewSize 
    param.setPreviewSize(ps.width, ps.height); 
    camera.setParameters(param); 
    camera.startPreview(); 
} 

look here

+0

什么是ps.width和ps.height? – moon

+0

previewSize。你必须给一个尺寸的高度和宽度。 –

0

它的发生,因为可能是Flash在接待Camera。尝试关闭闪光灯前置摄像头使用FLASH_MODE_OFF

Camera.Parameters p = mCamera.getParameters(); 
    p.setPreviewSize(300, 300); 

    if(CaptureCameraImage.cameraID == 0){ 
     String stringFlashMode = p.getFlashMode(); 
     if (stringFlashMode.equals("torch")) 
      p.setFlashMode("on"); // Light is set off, flash is set to normal 'on' mode 
     else 
      p.setFlashMode("torch"); 
    }else{ 
     p.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); 
    } 

    mCamera.setParameters(p); 
+0

发生同样的错误。我怀疑是闪光灯问题 – moon