设置显示方向失败

时间:2013-11-28 06:20:09

标签: android android-camera

我在我的应用程序中打开前置摄像头。在第一次运行应用程序运行正常,但当我再次运行应用程序第2次,第3次或第4次时,它给了我异常java.lang.RuntimeException : set display orientation failed
请帮助。

public class MirrorView extends SurfaceView implements
SurfaceHolder.Callback
{
 private static SurfaceHolder mHolder;
  private static Camera mCamera;
  private int zoom;
  private boolean freeze, hide = false;
  private final static String DEBUG_TAG = "MirrorView";
 public static final int MEDIA_TYPE_IMAGE = 1;
public MirrorView(Context context, Camera camera) 
{
    super(context);
    mCamera = camera;
    mHolder = getHolder();
    mHolder.addCallback(this);
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder) 
{
    try 
    {
            mCamera.stopPreview();
            mCamera.setPreviewDisplay(holder);
            mCamera.startPreview();
            Log.v(DEBUG_TAG, "Surface Created");

    } 
    catch (Exception error) 
    {
        Log.d("Debug",
                "Error starting mPreviewLayout: " + error.getMessage());
    }
}


public void surfaceChanged(SurfaceHolder holder, int format, int width,
    int height) 
{
    Log.v(DEBUG_TAG, "Surface changed");

     if (mHolder.getSurface() == null) 
    {
         Log.v(DEBUG_TAG, "Holder is null");
        return;
    }
    // can't make changes while mPreviewLayout is active
     try 
    {
        mCamera.stopPreview();
        Log.v(DEBUG_TAG, "Preview Stopped");
    } 

     catch (Exception e) 
    {
         e.printStackTrace();
    }

     Display display = Main.getDisplay();
        Camera.Parameters parameters = mCamera.getParameters();

     if(display.getRotation() == Surface.ROTATION_0)
        {
           Log.v(DEBUG_TAG, "orientation set to 90");
            parameters.setPreviewSize(height, width);
            mCamera.setDisplayOrientation(90);
        }

        if(display.getRotation() == Surface.ROTATION_90)
        {
            parameters.setPreviewSize(width, height);                           
        }

        if(display.getRotation() == Surface.ROTATION_180)
        {
            parameters.setPreviewSize(height, width);               
        }

        if(display.getRotation() == Surface.ROTATION_270)
        {
            Log.v(DEBUG_TAG, "orientation set to 180");
            parameters.setPreviewSize(width, height);
            mCamera.setDisplayOrientation(180);
        }

     try 
    {
        // start up the mPreviewLayout
        mCamera.setPreviewDisplay(mHolder);
        mCamera.startPreview();
    } 
      catch (Exception error) 
    {
        Log.d("Debug",
                "Error starting mPreviewLayout: " + error.getMessage());
    }
}

@Override
public boolean onTouchEvent(MotionEvent event) {
     if(event.getActionMasked() == MotionEvent.ACTION_POINTER_DOWN)
     {
         if(hide)
         {
             Main.ShowViews();
             hide = false;
         }
         else
         {
             Main.HideShow();
             hide = true;
         }
     }

      return true;
}


/*private PictureCallback mPicture = new PictureCallback() {

    @Override
    public void onPictureTaken(byte[] data, Camera camera) {

        File pictureFile = null; //getOutputMediaFile(MEDIA_TYPE_IMAGE);
        if (pictureFile == null)
        {
            Log.d(DEBUG_TAG, "Error creating media file, check storage permissions: " +
                "");
            return;
        }

        try {
           // FileOutputStream fos = new FileOutputStream(pictureFile);
           // fos.write(data);
           // fos.close();
        } catch (FileNotFoundException e) {
            Log.d(DEBUG_TAG, "File not found: " + e.getMessage());
        } catch (IOException e) {
            Log.d(DEBUG_TAG, "Error accessing file: " + e.getMessage());
        }
    }
};*/


public void ZoomIn()
{
     Camera.Parameters p = mCamera.getParameters();
        int maxZoom = p.getMaxZoom();

        if (p.isZoomSupported()) 
        {

           if (zoom < maxZoom) 
           {
               zoom += 10;
           }
           p.setZoom(zoom);
        }

        mCamera.setParameters(p);

        try 
        {
            mCamera.setPreviewDisplay(mHolder);
        } 
        catch (Exception e) 
        { 
            e.printStackTrace();
        }

         mCamera.startPreview();
}

public void ZoomOut()
{
    Camera.Parameters p = mCamera.getParameters();

    if (p.isZoomSupported()) 
    {

       if (zoom > 0) 
       {
           zoom -= 10;
       }

       p.setZoom(zoom);
    }

    mCamera.setParameters(p);

    try 
    {
        mCamera.setPreviewDisplay(mHolder);
    } 
    catch (Exception e) 
    { 
        e.printStackTrace();
    }

     mCamera.startPreview();
}

public void freezeMirror()
{
    if(freeze)
    {
        try 
        {
            mCamera.setPreviewDisplay(mHolder);
            mCamera.startPreview();
        } 
        catch (IOException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        freeze = false;
    }
    else
    {
    //  mCamera.takePicture(null, null, mPicture);

        mCamera.stopPreview();
        mCamera.startPreview();
        freeze = true;
    }
}

@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
    // TODO Auto-generated method stub

     if(mCamera != null)
     {
         //mCamera.stopPreview();
         mCamera.release();
     }
}


}

我有主要课程,这是我的laucher活动

public class Main extends Activity
{

private Camera mCam;
private MirrorView mCamPreview;
private int mCameraId = 0;
private FrameLayout mPreviewLayout;
private static ImageView zoomin, zoomout, freeze;
private static Display display;
private static File picfile;

private static final String DEBUG_TAG = "Main";
public static final int MEDIA_TYPE_IMAGE = 1;

@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    mCameraId = findFirstFrontFacingCamera();

    mPreviewLayout = (FrameLayout) findViewById(R.id.camPreview);
    zoomin = (ImageView) findViewById(R.id.zoomin);
    zoomout = (ImageView) findViewById(R.id.zoomout);
  //  freeze = (ImageView) findViewById(R.id.freeze);

    mPreviewLayout.removeAllViews();


    display = ((WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
   // picfile = getOutputMediaFile(MEDIA_TYPE_IMAGE); 

    setListeners();

    startCameraInLayout(mPreviewLayout, mCameraId);
}


public static void ShowViews()
{
    zoomin.setVisibility(View.VISIBLE);
    zoomout.setVisibility(View.VISIBLE);
    //freeze.setVisibility(View.VISIBLE);
}

public static void HideShow()
{
    zoomin.setVisibility(View.INVISIBLE);
    zoomout.setVisibility(View.INVISIBLE);
    //freeze.setVisibility(View.INVISIBLE);
}

public  static Display getDisplay()
{
     return display;

}

public void setListeners()
{
    zoomin.setOnClickListener(new OnClickListener()
    {

        @Override
        public void onClick(View arg0) 
        {
            // TODO Auto-generated method stub
            mCamPreview.ZoomIn();
        }

    });

    zoomout.setOnClickListener(new OnClickListener()
    {

        @Override
        public void onClick(View arg0) 
        {
            // TODO Auto-generated method stub
            mCamPreview.ZoomOut();
        }

    });

/*  freeze.setOnClickListener(new OnClickListener()
    {

        @Override
        public void onClick(View arg0) 
        {
            // TODO Auto-generated method stub
            mCamPreview.freezeMirror();
        }

    });*/

}



@Override
protected void onPause() 
{
    super.onPause();

    Log.v(DEBUG_TAG, "Pause");
    freeCamera();
}


public void freeCamera()
{
    if (mCam != null) 
    {
        mCam.release();
        mCam = null;
    }
}

private int findFirstFrontFacingCamera() 
{
    int foundId = -1;
    int numCams = Camera.getNumberOfCameras();
    for (int camId = 0; camId < numCams; camId++) 
    {
        CameraInfo info = new CameraInfo();
        Camera.getCameraInfo(camId, info);
        if (info.facing == CameraInfo.CAMERA_FACING_FRONT) 
        {
            foundId = camId;
            break;
        }
    }
    return foundId;
}

private void startCameraInLayout(FrameLayout layout, int cameraId) 
{
    mCam = Camera.open(cameraId);
    if (mCam != null) 
    {
        mCamPreview = new MirrorView(this, mCam);
       // setCameraDisplayOrientationAndSize();
        layout.addView(mCamPreview);
    }
}


}

日志文件:

    11-28 11:05:23.729: E/AndroidRuntime(23827): FATAL EXCEPTION: main
11-28 11:05:23.729: E/AndroidRuntime(23827): java.lang.RuntimeException: set display orientation failed
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.hardware.Camera.setDisplayOrientation(Native Method)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at com.gsmappstabs.mirror.MirrorView.surfaceChanged(MirrorView.java:83)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.SurfaceView.updateWindow(SurfaceView.java:558)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.SurfaceView.dispatchDraw(SurfaceView.java:350)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.ViewGroup.drawChild(ViewGroup.java:1649)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.ViewGroup.drawChild(ViewGroup.java:1649)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.ViewGroup.drawChild(ViewGroup.java:1649)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.View.draw(View.java:6923)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.widget.FrameLayout.draw(FrameLayout.java:357)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.ViewGroup.drawChild(ViewGroup.java:1651)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.ViewGroup.drawChild(ViewGroup.java:1649)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.View.draw(View.java:6923)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.widget.FrameLayout.draw(FrameLayout.java:357)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1869)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.ViewRoot.draw(ViewRoot.java:1540)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.ViewRoot.performTraversals(ViewRoot.java:1276)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.ViewRoot.handleMessage(ViewRoot.java:1880)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.os.Handler.dispatchMessage(Handler.java:99)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.os.Looper.loop(Looper.java:130)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.app.ActivityThread.main(ActivityThread.java:3701)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at java.lang.reflect.Method.invokeNative(Native Method)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at java.lang.reflect.Method.invoke(Method.java:507)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:895)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:653)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at dalvik.system.NativeStart.main(Native Method)
11-28 11:05:23.729: E/AndroidRuntime(23827): [Blue Error Handler] Make Debugging Report file for main
11-28 11:05:23.729: E/AndroidRuntime(23827): java.lang.RuntimeException: set display orientation failed
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.hardware.Camera.setDisplayOrientation(Native Method)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at com.gsmappstabs.mirror.MirrorView.surfaceChanged(MirrorView.java:83)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.SurfaceView.updateWindow(SurfaceView.java:558)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.SurfaceView.dispatchDraw(SurfaceView.java:350)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.ViewGroup.drawChild(ViewGroup.java:1649)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.ViewGroup.drawChild(ViewGroup.java:1649)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.ViewGroup.drawChild(ViewGroup.java:1649)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.View.draw(View.java:6923)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.widget.FrameLayout.draw(FrameLayout.java:357)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.ViewGroup.drawChild(ViewGroup.java:1651)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.ViewGroup.drawChild(ViewGroup.java:1649)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.View.draw(View.java:6923)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.widget.FrameLayout.draw(FrameLayout.java:357)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1869)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.ViewRoot.draw(ViewRoot.java:1540)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.ViewRoot.performTraversals(ViewRoot.java:1276)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.view.ViewRoot.handleMessage(ViewRoot.java:1880)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.os.Handler.dispatchMessage(Handler.java:99)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.os.Looper.loop(Looper.java:130)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at android.app.ActivityThread.main(ActivityThread.java:3701)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at java.lang.reflect.Method.invokeNative(Native Method)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at java.lang.reflect.Method.invoke(Method.java:507)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:895)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:653)
11-28 11:05:23.729: E/AndroidRuntime(23827):    at dalvik.system.NativeStart.main(Native Method)

2 个答案:

答案 0 :(得分:8)

在设置显示方向前调用stopPreview(),然后在设置显示方向后调用startPreview()

mCamera.stopPreview();
mCamera.setDisplayOrientation(90);
mCamera.startPreview();

答案 1 :(得分:0)

尽管这是一个古老的问题,但其他问题也可能有解决方案。但是,这是我的解决方案,可供以后参考,

确保停止预览并在活动暂停时释放相机。

@Override
protected void onPause() 
{
    super.onPause();
    Log.v(DEBUG_TAG, "Pause");
    mCam.stopPreview();
    mCam.release();
}