在Android的前置摄像头

时间:2012-11-15 23:21:56

标签: android camera

我正在制作一个应用程序,用户可以通过自定义摄像头录制视频。用户还可以通过前置摄像头录制视频。它记录得很好但是当我们在普通的媒体播放器中播放时,它只是在180度播放。我不知道它是如何可能的以及如何解决这个问题?请建议我任何解决方案。

代码:

package com.irantapps.cameraApplication;

import java.io.File;
import java.io.IOException;

import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.hardware.Camera;
import android.media.ExifInterface;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.media.MediaRecorder.VideoEncoder;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.SystemClock;
import android.provider.MediaStore;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.LinearInterpolator;
import android.widget.Button;
import android.widget.Chronometer;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.Toast;

import com.irantapps.AfterLoginHome;
import com.irantapps.BaseActivity;
import com.irantapps.CameraPlay_New;
import com.irantapps.R;
import com.irantapps.utility.DateAndLength;
import com.irantapps.utility.VideoDetailsCollection;

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

public class VideoCapture_New extends BaseActivity implements
        SurfaceHolder.Callback {
    private SurfaceView prSurfaceView;
    private ImageButton prStartBtn, prFrontBackCamera;
    private Button prSettingsBtn;
    private ImageButton btn_Gallery;
    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;
    int mRotation;
    LinearLayout linearLayoutRedbtn;
    ImageButton btn;
    Animation animation;
    ImageButton btn_Cancel;
    DateAndLength findDateandLength;
    private VideoDetailsCollection videoDetails = VideoDetailsCollection.getSingletonObject();
    @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);
        findDateandLength=DateAndLength.getSingletonObject();
        animation = new AlphaAnimation(1, 0); // Change alpha from fully visible
                                                // to invisible
        animation.setDuration(500); // duration - half a second
        animation.setInterpolator(new LinearInterpolator()); // do not alter
                                                                // animation
                                                                // rate
        animation.setRepeatCount(Animation.INFINITE); // Repeat animation
                                                        // infinitely
        animation.setRepeatMode(Animation.REVERSE); // Reverse animation at the
                                                    // end so the button will
                                                    // fade back in
        btn = (ImageButton) findViewById(R.id.main_btn1);
        btn_Cancel = (ImageButton)findViewById(R.id.btn_wrongTick);
        btn_Gallery = (ImageButton)findViewById(R.id.btn_gallerySelector);
        linearLayoutRedbtn = (LinearLayout) findViewById(R.id.linear_btn1);

        linearLayoutRedbtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                if (prRecordInProcess == false) {
                    cm_VideoCapture.setBase(SystemClock.elapsedRealtime());
                    //cm_VideoCapture.clearComposingText();

                    cm_VideoCapture.start();
                    try {
                        startRecording();
                    } catch (NoSuchMethodException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    linearLayoutRedbtn.startAnimation(animation);
                } else {
                    stopRecording();
                    linearLayoutRedbtn.clearAnimation();
                    cm_VideoCapture.stop();
                    findDateandLength.setTimeLengthOfVideo(cm_VideoCapture.getText().toString());
            //Toast.makeText(getApplicationContext(), "hello..."+cm_VideoCapture.getText(), Toast.LENGTH_LONG).show();      
                    cm_VideoCapture.clearComposingText();
                    Intent intent = new Intent(VideoCapture_New.this,
                            CameraPlay_New.class);
                    startActivity(intent);
                }

            }
        });
        btn_Gallery.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                  Intent intent = new Intent();
                  intent.setType("video/*");
                  intent.setAction(Intent.ACTION_GET_CONTENT);
                  startActivityForResult(Intent.createChooser(intent,"Select Video"), 2);
            }
        });
        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);

        //cm_VideoCapture.start();

        cm_VideoCapture.clearComposingText();
        // prSettingsBtn = (Button) findViewById(R.id.main_btn2);
        prRecordInProcess = false;
        prStartBtn.setOnClickListener(new View.OnClickListener() {
            // @Override
            public void onClick(View v) {
                if (prRecordInProcess == false) {
                    cm_VideoCapture.setBase(SystemClock.elapsedRealtime());
                    //cm_VideoCapture.clearComposingText();

                    cm_VideoCapture.start();
                    try {
                        startRecording();
                    } catch (NoSuchMethodException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                } else {
                    stopRecording();
                    btn.clearAnimation();
                    cm_VideoCapture.stop();
                    cm_VideoCapture.clearComposingText();
                    Intent intent = new Intent(VideoCapture_New.this,
                            CameraPlay_New.class);
                    startActivity(intent);
                }
            }
        });

        prFrontBackCamera.setOnClickListener(new View.OnClickListener() {

            @SuppressLint("NewApi")
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                // prCamera = openFrontFacingCameraGingerbread();
                try {
                    if (Camera.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);
        // prCamera.setDisplayOrientation(90);
        prMediaRecorder = new MediaRecorder();

        btn_Cancel.setOnClickListener(new View.OnClickListener() {

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

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

    @SuppressLint({ "NewApi", "NewApi", "NewApi", "NewApi", "NewApi", "NewApi", "NewApi", "NewApi", "NewApi", "NewApi", "NewApi", "NewApi" })
    @Override
    public void surfaceCreated(SurfaceHolder arg0) {
        if (frontCamera == false && prCamera== null) {
            /*prCamera = Camera.open();
            if (prCamera == null) {
                Toast.makeText(this.getApplicationContext(),
                        "Camera is not available!", Toast.LENGTH_SHORT).show();
                finish();
            }*/
            prCamera = Camera.open();
            try {
                prCamera.setPreviewDisplay(arg0);

                // TODO test how much setPreviewCallbackWithBuffer is faster
                //prCamera.setPreviewCallback(VideoCapture_New.this);
            } catch (IOException e) {
                prCamera.release();
                prCamera = null;
            }

            if (prCamera == null) {
                Toast.makeText(this.getApplicationContext(),
                        "Camera is not available!", Toast.LENGTH_SHORT).show();
                finish();
            }
        } 
        /*else if (prCamera == null) {
            prCamera = Camera.open();
            try {
                prCamera.setPreviewDisplay(arg0);

                // TODO test how much setPreviewCallbackWithBuffer is faster
                //prCamera.setPreviewCallback(VideoCapture_New.this);
            } catch (IOException e) {
                prCamera.release();
                prCamera = null;
            }

            if (prCamera == null) {
                Toast.makeText(this.getApplicationContext(),
                        "Camera is not available!", Toast.LENGTH_SHORT).show();
                finish();
            }
        }*/else if (prCamera!=null){
            prCamera.stopPreview();
            prCamera.release();
            prCamera=null;
    }

        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();
            }
        }
        try {
            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) % 180;
                result = (360 - result) % 360; // compensate the mirror
            } else { // back-facing
                result = (info.orientation - degrees + 360) % 360;
            }
            this.mRotation = result;
            prCamera.setDisplayOrientation(result);
        } catch (NoClassDefFoundError e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            prCamera.setDisplayOrientation(90);
            Toast.makeText(VideoCapture_New.this,
                    "There is no Front Camera Facility.", Toast.LENGTH_SHORT)
                    .show();
        }
    }


     @Override
     public void surfaceDestroyed(SurfaceHolder holder) {
         if (prCamera != null) {
             prCamera.stopPreview();
             prCamera.setPreviewCallback(null);
             prCamera.release();
             prCamera = null;
         }
     }

    /*@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();
            try {
                startRecording();
            } catch (NoSuchMethodException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            Toast.makeText(prContext, "Recording restarted with new options!",
                    Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(prContext, "Recording options updated!",
                    Toast.LENGTH_SHORT).show();
        }
    }

    @SuppressLint("NewApi")
    private boolean startRecording() throws NoSuchMethodException {
        prCamera.stopPreview();
        try {
            prCamera.unlock();
            prMediaRecorder.setCamera(prCamera);

            prMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
            prMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
            String lVideoFileFullPath = ".mov";

            prMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            String lDisplayMsg = "Current container format: ";
            prMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
            prMediaRecorder.setVideoEncoder(VideoEncoder.H263);
            prMediaRecorder.setOrientationHint(90);

            lDisplayMsg += "Current encoding format: ";

            lVideoFileFullPath = Environment.getExternalStorageDirectory() + "/myvideo.mp4";
            // 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;
            ExifInterface exif_Video = new ExifInterface(lVideoFileFullPath);     //Since API Level 5
            String exifOrientation_video = exif_Video.getAttribute(ExifInterface.TAG_ORIENTATION);
            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;
        case 2:
            if (resultCode == RESULT_OK) {
                //updateEncodingOptions();
                if(requestCode == 2)
                {
                  Uri selectedImageUri = intent.getData();
                   String  selectedImagePath = getPath(selectedImageUri);
                    System.out.println("Image Path : " + selectedImagePath);
                    File file_Video = new File(selectedImagePath);
                    MediaPlayer mp = new MediaPlayer();
                    try {
                        mp.setDataSource(file_Video.getAbsolutePath());
                        videoDetails.setVideoPath(file_Video.getAbsolutePath());
                        if(mp.getDuration()<=3)
                        {
                        Intent intentGallery = new Intent(VideoCapture_New.this, CameraPlay_New.class);
                        startActivity(intentGallery);
                        }
                        else
                        {
                            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
                                    this);

                            // set title

                            alertDialogBuilder
                            .setTitle("Info");
                            // set dialog message
                            alertDialogBuilder
                            .setMessage("Video can't be larger than 3 mins.")
                            .setCancelable(false)
                            .setPositiveButton("OK",new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,int id) {
                                    // if this button is clicked, close
                                    // current activity
                                    dialog.cancel();

                                }
                            });

                            // create alert dialog
                            AlertDialog alertDialog = alertDialogBuilder.create();

                            // show it
                            alertDialog.show();
                        }
                    } catch (IllegalArgumentException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IllegalStateException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println("Video Length:"+mp.getDuration());

                }
                    //img.setImageURI(selectedImageUri);
            }
            break;
        }
    }
     public String getPath(Uri uri) {
            String[] projection = { MediaStore.Video.Media.DATA };
            Cursor cursor = managedQuery(uri, projection, null, null, null);
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        }
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {

            /*
             * if(collapse==true||collapse_cat==true||collapse_FuelEconomy==true||
             * collapse_LatestNews
             * ==true||collapse_price==true||collapse_RecentlyViwed==true){
             * Intent restartResearchActivity = new
             * Intent(ResearchListNew.this,ResearchListNew.class);
             * restartResearchActivity.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
             * startActivity(restartResearchActivity);
             * 
             * } else { finish(); }
             */
            if (prRecordInProcess == false)
            {
                prCamera.lock();
            }
            else
            {
                stopRecording();
                prCamera.lock();
            }

            Intent intent = new Intent(VideoCapture_New.this,
                    AfterLoginHome.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);
            return true;
        } else {

            return super.onKeyDown(keyCode, event);
        }

    }
}

提前致谢。

1 个答案:

答案 0 :(得分:2)

new Camera().setDisplayOrientation(90);