Advertisement
ddkclaudio

Untitled

Jan 2nd, 2013
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.95 KB | None | 0 0
  1.  
  2. package com.app.artesp;
  3.  
  4. import java.util.List;
  5.  
  6. import android.annotation.SuppressLint;
  7. import android.content.Context;
  8. import android.hardware.Camera;
  9. import android.hardware.Camera.PictureCallback;
  10. import android.hardware.Camera.Size;
  11. import android.media.MediaRecorder;
  12. import android.os.Build;
  13. import android.util.Log;
  14. import android.view.SurfaceHolder;
  15. import android.view.SurfaceView;
  16.  
  17.  
  18. @SuppressLint({ "NewApi", "ViewConstructor" })
  19. public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
  20.  
  21.     private Camera        camera;
  22.     private MediaRecorder recorder;
  23.     private Size          recorderVideoSize;
  24.     private SurfaceHolder surfaceHolder;
  25.    
  26.  
  27.     public CameraPreview( Context ctx, Camera camera ) {
  28.         super( ctx );
  29.  
  30.         debug( "Construtor " );
  31.        
  32.         this.camera = camera;
  33.         surfaceHolder = getHolder( );
  34.         surfaceHolder.addCallback( this );
  35.         surfaceHolder.setType( SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS );
  36.        
  37.  
  38.     }
  39.  
  40.     /** Metodo  do implements SurfaceHolder.Callback aplicando a previa da camera*/
  41.     public void surfaceCreated(SurfaceHolder holder) {
  42.         debug( "surfaceCreated" );
  43.         try {
  44.             camera.setPreviewDisplay( holder );
  45.             camera.startPreview( );
  46.         }
  47.         catch( Exception e ) {
  48.             e.printStackTrace( );
  49.         }
  50.     }
  51.    
  52.  
  53.     /** Inserindo as configuracoes da camera e o PreviewDisplay , finalmente iniciando a camera */
  54.     public void surfaceChanged( SurfaceHolder holder, int format, int width, int height ) {
  55.         debug( "surfaceChanged" );
  56.        
  57.         if( surfaceHolder.getSurface() == null ) {
  58.             return;
  59.         }
  60.  
  61.         debug( "surfaceChanged 2" );
  62.  
  63.         try {
  64.             camera.stopPreview( );
  65.         }
  66.         catch( Exception e ) {
  67.         }
  68.        
  69.         try {
  70.  
  71.             Camera.Parameters params = camera.getParameters( );
  72.  
  73.             List<Size> sizes = null;
  74.            
  75.             if( Build.VERSION.SDK_INT > Build.VERSION_CODES.HONEYCOMB ) {
  76.  
  77.                 try {
  78.                     sizes = params.getSupportedVideoSizes( );
  79.                 }
  80.                 catch( Exception e ) {
  81.                 }
  82.                 if( sizes == null ) {
  83.                     sizes = params.getSupportedPreviewSizes( );
  84.                 }
  85.             }
  86.             else {
  87.                 sizes = params.getSupportedPreviewSizes( );
  88.             }
  89.            
  90.             // Definindo as configuracoes da camera
  91.             Size optimalSize = getOptimalPreviewSize( sizes, width, height );
  92.             params.setPreviewSize( optimalSize.width, optimalSize.height );
  93.  
  94.             recorderVideoSize = optimalSize;
  95.  
  96.             params.setJpegQuality( 70 );
  97.             params.setFlashMode( Camera.Parameters.FLASH_MODE_AUTO );
  98.             params.setFocusMode( Camera.Parameters.FOCUS_MODE_AUTO );
  99.             params.setSceneMode( Camera.Parameters.SCENE_MODE_AUTO );
  100.             params.set( "cam_mode", 1 );
  101.            
  102.             //adicionando as configuracoes a camera e adicionando o PreviewDisplay
  103.             camera.setParameters( params );
  104.             camera.setPreviewDisplay( surfaceHolder );
  105.  
  106.             camera.startPreview( );// Iniciando a camera definitivamente
  107.         }
  108.         catch( Exception e ) {
  109.             e.printStackTrace( );
  110.         }
  111.     }
  112.  
  113.     /** Para a camera :PreviewDisplay*/
  114.     public void surfaceDestroyed(SurfaceHolder holder) {
  115.         debug( "surfaceDestroyed" );
  116.         if( camera != null ) {
  117.             camera.stopPreview( );
  118.         }
  119.     }
  120.  
  121.     /** Configuracoes da camera :PreviewDisplay*/
  122.     private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
  123.         final double ASPECT_TOLERANCE = 0.05;
  124.         double targetRatio = (double) w / h;
  125.         if (sizes == null) return null;
  126.  
  127.         Size optimalSize = null;
  128.         double minDiff = Double.MAX_VALUE;
  129.  
  130.         int targetHeight = h;
  131.  
  132.         for (Size size : sizes) {
  133.             Log.d( "SIZES", "" + size.width + ", " + size.height );
  134.         }
  135.  
  136.         // Try to find an size match aspect ratio and size
  137.         for (Size size : sizes) {
  138.             double ratio = (double) size.width / size.height;
  139.             if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
  140.             if (Math.abs(size.height - targetHeight) < minDiff) {
  141.                 optimalSize = size;
  142.                 minDiff = Math.abs(size.height - targetHeight);
  143.                 break;
  144.             }
  145.         }
  146.  
  147.         // Cannot find the one match the aspect ratio, ignore the requirement
  148.         if (optimalSize == null) {
  149.             minDiff = Double.MAX_VALUE;
  150.             for (Size size : sizes) {
  151.                 if (Math.abs(size.height - targetHeight) < minDiff) {
  152.                     optimalSize = size;
  153.                     minDiff = Math.abs(size.height - targetHeight);
  154.                 }
  155.             }
  156.         }
  157.         return optimalSize;
  158.     }
  159.  
  160.     public boolean startRecording( ) {
  161.         debug( "startRecording" );
  162.        
  163.         boolean ok = true;
  164.  
  165.         final int[] audioSources = new int[]{ MediaRecorder.AudioSource.CAMCORDER, MediaRecorder.AudioSource.DEFAULT };
  166.         final int[] audioEncoders = new int[]{ MediaRecorder.AudioEncoder.AAC, MediaRecorder.AudioEncoder.AMR_NB, MediaRecorder.AudioEncoder.DEFAULT };
  167.         final int[] videoCodecs = new int[]{ MediaRecorder.VideoEncoder.MPEG_4_SP, MediaRecorder.VideoEncoder.H264, MediaRecorder.VideoEncoder.H263, MediaRecorder.VideoEncoder.DEFAULT };
  168.  
  169.         recorder = new MediaRecorder( );
  170.         String fileVideo = CameraUtils.getOutputMediaFile( CameraUtils.MEDIA_TYPE_VIDEO ).toString( );
  171.  
  172.         for( int sources = 0; sources < audioSources.length; ++sources ) {
  173.             for( int encoders = 0; encoders < audioEncoders.length; ++encoders ) {
  174.                 for( int codecs = 0; codecs < videoCodecs.length; ++codecs ) {
  175.  
  176.                     try {
  177.                         try {
  178.                             camera.unlock( );
  179.                         }
  180.                         catch( Exception e ) {
  181.                             e.printStackTrace( );
  182.                             try {
  183.                                 camera.reconnect( );
  184.                                 camera.unlock( );
  185.                             }
  186.                             catch( Exception e2 ) {
  187.                                 e2.printStackTrace( );
  188.                             }
  189.                         }
  190.                         recorder.reset            ( );
  191.                         recorder.setCamera        ( camera );
  192.                         recorder.setAudioSource   ( audioSources[ sources ] );
  193.                         recorder.setVideoSource   ( MediaRecorder.VideoSource.CAMERA );
  194.                         recorder.setOutputFormat  ( MediaRecorder.OutputFormat.MPEG_4 );
  195.                         recorder.setAudioEncoder  ( audioEncoders[ encoders ] );
  196.                         recorder.setVideoEncoder  ( videoCodecs[ codecs ] );
  197.                         recorder.setPreviewDisplay( getHolder( ).getSurface( ) );
  198.                         recorder.setVideoSize     ( recorderVideoSize.width, recorderVideoSize.height );
  199.                         recorder.setOutputFile    ( fileVideo );
  200.                         recorder.prepare          ( );
  201.                     }
  202.                     catch( Exception e ) {
  203.                         e.printStackTrace( );
  204.                         ok = false;
  205.                     }
  206.            
  207.                     if( ok == true ) {
  208.                         try {
  209.                             recorder.start( );// inicia a gravacao
  210.                         }
  211.                         catch( Exception e ) {
  212.                             try {
  213.                                 recorder.release( );
  214.                                 camera.lock( );
  215.                             }
  216.                             catch( Exception e2 ) {
  217.                                 e2.printStackTrace();
  218.                             }
  219.                             ok = false;
  220.                             e.printStackTrace( );
  221.                         }
  222.                     }
  223.                    
  224.                     if( ok == true ) {
  225.                         return true;
  226.                     }
  227.                 }
  228.             }
  229.         }
  230.  
  231.         Utils.deleteMediaFileAndThumb( fileVideo );
  232.        
  233.         return false;
  234.     }
  235.  
  236.  
  237.     public void stopRecording( ) {
  238.         debug( "stopRecording" );
  239.         if( recorder != null ) {
  240.  
  241.             try {
  242.                 recorder.release( );
  243.                 camera.lock( );
  244.             }
  245.             catch( Exception e ) {
  246.                 e.printStackTrace();
  247.             }
  248.  
  249.             recorder = null;
  250.         }
  251.     }
  252.    
  253.    
  254.     public void takeScreenShot( PictureCallback pc ) {
  255.             debug( "takeScreenshot" );
  256.             camera.takePicture( null, null, pc );
  257.         }
  258.    
  259.  
  260.     private void debug( String s ) {
  261.         Log.d("CamPreview", s);
  262.     }
  263.  
  264.  
  265.     public void onPause( ) {
  266.         if( camera != null ) {
  267.             try {
  268.                 camera.stopPreview( );
  269.             }
  270.             catch( Exception e ) {
  271.             }
  272.         }
  273.     }
  274.  
  275.    
  276.     public void onResume( ) {
  277.         if( camera != null ) {
  278.             try {
  279.                 camera.startPreview( );
  280.             }
  281.             catch( Exception e ) {
  282.             }
  283.         }
  284.     }
  285.  
  286.    
  287.     public void release( ) {
  288.         debug( "RELEASE" );
  289.         if( camera != null ) {
  290.             stopRecording( );
  291.  
  292.             debug( "STOP PREVIEW" );
  293.             try {
  294.                 camera.stopPreview( );
  295.             }
  296.             catch( Exception e ) {
  297.             }
  298.  
  299.             debug( "SET PREVIEW DISPLAY" );
  300.             try {
  301.                 camera.setPreviewDisplay( null );
  302.             }
  303.             catch( Exception e ) {
  304.             }
  305.  
  306.             debug( "CAMERA RELEASE" );
  307.             try {
  308.                 camera.release( );
  309.             }
  310.             catch( Exception e ) {
  311.             }
  312.             camera = null;
  313.         }
  314.     }
  315.  
  316. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement