2012-11-15 4 views
1

사용자가 비디오를 녹화 할 수있는 응용 프로그램을 만들고 있습니다. 사용자는 전면 카메라를 통해 비디오를 녹화 할 수도 있습니다. 그것은 잘 기록하지만 우리가 정상적인 미디어 플레이어에서 그것을 재생할 때 그것은 단지 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); 
     } 

    } 
} 

감사합니다. 의

+0

가능한 중복 [안드로이드 카메라 회전은] (http://stackoverflow.com/questions/5309029/android-camera-rotate) 또한 당신이 필요로하는 – PearsonArtPhoto

+0

당신이 프로그래밍 무엇 API 버전을 알려합니다. 4.2에서 작동하는 것은 이미지 방향과 관련하여 2.1에서 작동하지 않습니다. – Codeguy007

+0

Android 2.3.3 API 버전 전 @ Codeguy007을 사용합니다 –

답변

2
new Camera().setDisplayOrientation(90);