我们开始录制时相机自动倾斜

时间:2012-09-12 18:47:13

标签: android

我在我的应用程序中遇到了一个问题,因为当我开始通过摄像机录制时,它会倾向于景观,这不是必需的。要求是录制应根据设备的方向开始。表示如果设备处于纵向模式,则录制应以纵向开始,如果摄像机处于横向模式,则录制将以横向方式进行。

但是在我们点击开始录制按钮的情况下,相机方向将自动更改为横向但设备仍然是纵向。

所以,请就此提出任何解决方案。

代码:

package com.irant.cameraApplication;

import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.hardware.Camera;
import android.media.MediaRecorder;
import android.media.MediaRecorder.VideoEncoder;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.Chronometer;
import android.widget.ImageButton;
import android.widget.Toast;

import com.irant.a1techno.CameraPlay;
import com.irant.a1techno.R;

/***
 *  TODO: 1. sound on/off
 *  2. resolution change
 * @author roman10
 *
 */

public class VideoCapture_New extends Activity implements SurfaceHolder.Callback {
    private SurfaceView prSurfaceView;
    private ImageButton prStartBtn, prFrontBackCamera;
    private Button prSettingsBtn;
    public String TAG = "IRANT";
    private boolean prRecordInProcess;
    private SurfaceHolder prSurfaceHolder;
    private Camera prCamera;
    private final String cVideoFilePath = "/sdcard/";
    Chronometer cm_VideoCapture;
    private Context prContext;
    public static boolean frontCamera= false;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        prContext = this.getApplicationContext();
        setContentView(R.layout.videocapture_new);
        Utils.createDirIfNotExist(cVideoFilePath);

        cm_VideoCapture = (Chronometer)findViewById(R.id.cm_VideoCapture);
        prSurfaceView = (SurfaceView) findViewById(R.id.surface_camera);
        prStartBtn = (ImageButton) findViewById(R.id.main_btn1);
        prFrontBackCamera = (ImageButton)findViewById(R.id.btn_frontBackCamera);

       // prSettingsBtn = (Button) findViewById(R.id.main_btn2);
        prRecordInProcess = false;
        prStartBtn.setOnClickListener(new View.OnClickListener() {
            //@Override
            public void onClick(View v) {
                if (prRecordInProcess == false) {
                    startRecording();
                    cm_VideoCapture.start();
                } else {
                    stopRecording();
                    cm_VideoCapture.stop();
                    Intent intent = new Intent(VideoCapture_New.this, CameraPlay.class);
                    startActivity(intent);
                }
            }
        });

        prFrontBackCamera.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                //prCamera = openFrontFacingCameraGingerbread();
                try{
            if(prCamera.getNumberOfCameras()==2)
            {
                if(frontCamera)
                {
                    frontCamera = false;
                    prCamera.stopPreview();
                    prMediaRecorder.release();
                    prMediaRecorder = null;
                    prCamera.release();
                    prCamera = null;
                }
                else
                {

                    frontCamera = true;
                    prCamera.stopPreview();
                    prMediaRecorder.release();
                    prMediaRecorder = null;
                    prCamera.release();
                    prCamera = null;
                }
                Intent intent = new Intent(VideoCapture_New.this, VideoCapture_New.class);
                startActivity(intent);
            }
            else
            {
                Toast.makeText(VideoCapture_New.this, "Your device doesn't contain Front Camera.", Toast.LENGTH_SHORT).show();
            }
                }catch(Exception e)
                {
                    e.printStackTrace();
                    Toast.makeText(VideoCapture_New.this, "Your device is not compatible for Front Camera.", Toast.LENGTH_SHORT).show();

                }

            }
        });

        prSurfaceHolder = prSurfaceView.getHolder();
        prSurfaceHolder.addCallback(this);
        prSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        prMediaRecorder = new MediaRecorder();
    }

    private Camera openFrontFacingCameraGingerbread() 
    {
         Camera camera = null;

            // Look for front-facing camera, using the Gingerbread API.
            // Java reflection is used for backwards compatibility with pre-Gingerbread APIs.
            try {
                Class<?> cameraClass = Class.forName("android.hardware.Camera");
                Object cameraInfo = null;
                Field field = null;
                int cameraCount = 0;
                Method getNumberOfCamerasMethod = cameraClass.getMethod( "getNumberOfCameras" );
                if ( getNumberOfCamerasMethod != null ) {
                    cameraCount = (Integer) getNumberOfCamerasMethod.invoke( null, (Object[]) null );
                }
                Class<?> cameraInfoClass = Class.forName("android.hardware.Camera$CameraInfo");
                if ( cameraInfoClass != null ) {
                    cameraInfo = cameraInfoClass.newInstance();
                }
                if ( cameraInfo != null ) {
                    field = cameraInfo.getClass().getField( "facing" );
                }
                Method getCameraInfoMethod = cameraClass.getMethod( "getCameraInfo", Integer.TYPE, cameraInfoClass );
                if ( getCameraInfoMethod != null && cameraInfoClass != null && field != null ) {
                    for ( int camIdx = 0; camIdx < cameraCount; camIdx++ ) {
                        getCameraInfoMethod.invoke( null, camIdx, cameraInfo );
                        int facing = field.getInt( cameraInfo );
                        if ( facing == 1 ) { // Camera.CameraInfo.CAMERA_FACING_FRONT 
                            try {
                                Method cameraOpenMethod = cameraClass.getMethod( "open", Integer.TYPE );
                                if ( cameraOpenMethod != null ) {
                                    camera = (Camera) cameraOpenMethod.invoke( null, camIdx );
                                }
                            } catch (RuntimeException e) {
                                Log.e(TAG, "Camera failed to open: " + e.getLocalizedMessage());
                                camera= prCamera;
                            }
                        }
                    }
                }
            }
            // Ignore the bevy of checked exceptions the Java Reflection API throws - if it fails, who cares.
            catch ( ClassNotFoundException e        ) {Log.e(TAG, "ClassNotFoundException" + e.getLocalizedMessage());}
            catch ( NoSuchMethodException e         ) {Log.e(TAG, "NoSuchMethodException" + e.getLocalizedMessage());}
            catch ( NoSuchFieldException e          ) {Log.e(TAG, "NoSuchFieldException" + e.getLocalizedMessage());}
            catch ( IllegalAccessException e        ) {Log.e(TAG, "IllegalAccessException" + e.getLocalizedMessage());}
            catch ( InvocationTargetException e     ) {Log.e(TAG, "InvocationTargetException" + e.getLocalizedMessage());}
            catch ( InstantiationException e        ) {Log.e(TAG, "InstantiationException" + e.getLocalizedMessage());}
            catch ( SecurityException e             ) {Log.e(TAG, "SecurityException" + e.getLocalizedMessage());}
            catch ( NullPointerException e             ) {Log.e(TAG, "NullPointerException" + e.getLocalizedMessage());}

            if ( camera == null ) {
                // Try using the pre-Gingerbread APIs to open the camera.
                try {
                    camera = Camera.open();
                } catch (RuntimeException e) {
                    Log.e(TAG, "Camera failed to open: " + e.getLocalizedMessage());
                }
            }

            return camera;
    }

    @Override
    public void surfaceChanged(SurfaceHolder _holder, int _format, int _width, int _height) {
        Camera.Parameters lParam = prCamera.getParameters();

        prCamera.setParameters(lParam);
        try {
            prCamera.setPreviewDisplay(_holder);
            prCamera.startPreview();
            //prPreviewRunning = true;
        } catch (IOException _le) {
            _le.printStackTrace();
        }
    }

    @Override
    public void surfaceCreated(SurfaceHolder arg0) {
        if(frontCamera == false)
        {
        prCamera = Camera.open();
        if (prCamera == null) {
            Toast.makeText(this.getApplicationContext(), "Camera is not available!", Toast.LENGTH_SHORT).show();
            finish();
        }
        }
        else if(frontCamera == true)
        {
            try{
         int cameraCount = 0;
            Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
            cameraCount = Camera.getNumberOfCameras();
            for ( int camIdx = 0; camIdx < cameraCount; camIdx++ ) {
                Camera.getCameraInfo( camIdx, cameraInfo );
                if ( cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT  ) {
                    try {
                        prCamera = Camera.open( camIdx );
                    } catch (RuntimeException e) {
                        Log.i("Camera failed to open: ",e.getLocalizedMessage());
                    }
                }
            }
            }catch(Exception e)
            {
                Toast.makeText(VideoCapture_New.this, "Your Device doesn't compatible for Fron Camera.", Toast.LENGTH_SHORT).show();
            }
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder arg0) {
        try {
            if (prRecordInProcess) {
                stopRecording();
            } else {
                prCamera.stopPreview();
            }
            prMediaRecorder.release();
            prMediaRecorder = null;
            prCamera.release();
            prCamera = null;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }


    private MediaRecorder prMediaRecorder;
    private final int cMaxRecordDurationInMs = 30000;
    private final long cMaxFileSizeInBytes = 5000000;
    private final int cFrameRate = 20;
    private File prRecordedFile;

    private void updateEncodingOptions() {
        if (prRecordInProcess) {
            stopRecording();
            startRecording();
            Toast.makeText(prContext, "Recording restarted with new options!", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(prContext, "Recording options updated!", Toast.LENGTH_SHORT).show();
        }
    }

    private boolean startRecording() {
        prCamera.stopPreview();
        try {
            prCamera.unlock();
            prMediaRecorder.setCamera(prCamera);

            prMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

            String lVideoFileFullPath=".mp4";
            prMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            String lDisplayMsg = "Current container format: ";
            prMediaRecorder.setVideoEncoder(VideoEncoder.H263);


            lDisplayMsg += "Current encoding format: ";

            lVideoFileFullPath = cVideoFilePath + "myvideo" + lVideoFileFullPath;
            //prMediaRecorder.setOrientationHint(360);
            prMediaRecorder.setVideoSize(176, 144); 
            prMediaRecorder.setVideoFrameRate(12);
            prRecordedFile = new File(lVideoFileFullPath);
            prMediaRecorder.setOutputFile(prRecordedFile.getPath());


            prMediaRecorder.setVideoFrameRate(cFrameRate);
            prMediaRecorder.setPreviewDisplay(prSurfaceHolder.getSurface());
            prMediaRecorder.setMaxDuration(cMaxRecordDurationInMs);
            prMediaRecorder.setMaxFileSize(cMaxFileSizeInBytes);
            //prepare for capturing
            //state: DataSourceConfigured => prepared
            prMediaRecorder.prepare();
            //start recording
            //state: prepared => recording
            prMediaRecorder.start();
            //prStartBtn.setText("Stop");
            prRecordInProcess = true;
            return true;
        } catch (IOException _le) {
            _le.printStackTrace();
            return false;
        }
    }

    private void stopRecording() {
        prMediaRecorder.stop();
        prMediaRecorder.reset();
        try {
            prCamera.reconnect();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //prStartBtn.setText("Start");
        prRecordInProcess = false;
        prCamera.startPreview();
    }

    private static final int REQUEST_DECODING_OPTIONS = 0;
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
        super.onActivityResult(requestCode, resultCode, intent);
        switch (requestCode) {
        case REQUEST_DECODING_OPTIONS:
            if (resultCode == RESULT_OK) {
                updateEncodingOptions();
            }
            break;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,这个小修剪了它

        Camera.CameraInfo info = new android.hardware.Camera.CameraInfo();
        Camera.getCameraInfo(0, info);
        int rotation = getWindowManager().getDefaultDisplay().getRotation();
        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;  // compensate the mirror
        } else {  // back-facing
            result = (info.orientation - degrees + 360) % 360;
        }

        this.mRotation = result;

        mCamera.setDisplayOrientation(result);

我不确定为什么它不会从当前的手机定位开始,但我确信这会解决它。