天天看點

android錄影機自動聚焦閑着無聊寫的一個測試相機,查了各種資料希望對大家有幫助.廢話不多說了直接上代碼

閑着無聊寫的一個測試相機,查了各種資料希望對大家有幫助.

需要完整工程的可以到:https://git.oschina.net/mashuai1989/VideoTest.git下載下傳

廢話不多說了直接上代碼

布局檔案:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <SurfaceView 
        android:id="@+id/surfaceview"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
       />
   <Button
            android:layout_alignParentBottom="true"
       android:text="@string/start"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:id="@+id/start"/>
</RelativeLayout>      

權限配置:

各種權限申請

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.videotest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="9"
        android:targetSdkVersion="20" />
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.videotest.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <supports-screens
            android:smallScreens="true"
            android:normalScreens="true"
            android:largeScreens="true"
            android:resizeable="true"
            android:anyDensity="true"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO" >
    </uses-permission>
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    <uses-feature android:name="android.hardware.Camera.AutoFocusCallback" />
</manifest>      

java代碼:

注釋已經很詳細了,有什麼問題可以留言

package com.example.videotest;
import java.io.File;
import java.io.IOException;
import java.net.URL;

import android.hardware.Camera;
import android.hardware.Camera.CameraInfo;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.*;
import android.view.SurfaceHolder.Callback;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;


public class MainActivity extends Activity implements OnClickListener{
   private Camera mCamera;
   private SurfaceView mSurfaceView;
   private SurfaceHolder mSurfaceHolder;
   private Button startButton;
   private boolean mIsRecording = false;
   private MediaRecorder mediaRecorder;
   private File dir;
   private File myRecAudioFile;
   private String SD_CARD_TEMP_DIR = getSDPath() + File.separator + "XueYinYue"
         + File.separator;
   private Camera.AutoFocusCallback myAutoFocusCallback = null;
   private int result;//相機旋轉角度
   private int width;//螢幕寬度
   private int height;//螢幕高度
   private float density;
   private int densityDpi;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      mSurfaceView = (SurfaceView)findViewById(R.id.surfaceview);
      mSurfaceHolder = mSurfaceView.getHolder();
      mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
      dir = new File(SD_CARD_TEMP_DIR);
      if (!dir.exists()) {
         dir.mkdir();//若檔案夾不存在建立檔案夾
      }


      mSurfaceHolder.addCallback(new Callback() {
         @Override
         public void surfaceDestroyed(SurfaceHolder holder) {
            releaseCamera();
         }
         
         @Override
         public void surfaceCreated(SurfaceHolder holder) {

            initpreview();
         }
         
         @Override
         public void surfaceChanged(SurfaceHolder holder, int format, int width,
               int height) {
            
         }
      });
      startButton = (Button)findViewById(R.id.start);
      startButton.setOnClickListener(this);
      myAutoFocusCallback = new Camera.AutoFocusCallback() {

         public void onAutoFocus(boolean success, Camera camera) {

            if(success){
               mCamera.setOneShotPreviewCallback(null);
               Toast.makeText(MainActivity.this,
                     "自動聚焦成功", Toast.LENGTH_SHORT).show();
            }else {
               Toast.makeText(MainActivity.this,
                     "自動聚焦失敗", Toast.LENGTH_SHORT).show();
            }

         }
      };

      DisplayMetrics metric = new DisplayMetrics();
      getWindowManager().getDefaultDisplay().getMetrics(metric);
      width= metric.widthPixels;  // 螢幕寬度(像素)
      height = metric.heightPixels;  // 螢幕高度(像素)
      Log.d("---width----",width+"");
      Log.d("---height----",height+"");
      //density = metric.density;  // 螢幕密度(0.75 / 1.0 / 1.5)
//    densityDpi = metric.densityDpi;  // 螢幕密度DPI(120 / 160 / 240)
   }

   protected void releaseCamera() {
      if(mCamera!=null){
         mCamera.lock();//攝像頭上鎖
         mCamera.stopPreview();//停止攝像頭預覽
         mCamera.release();
         mCamera = null;
      }
   }

   protected void initpreview() {
      if(mCamera!=null){

         mCamera=null;
         Log.d("--mcamera--","isnull");
      }
      mCamera = Camera.open(CameraInfo.CAMERA_FACING_BACK);//CAMERA_FACING_FRONT前置攝像頭,CAMERA_FACING_BACK後置攝像頭
      try {
         mCamera.setPreviewDisplay(mSurfaceHolder);
      } catch (IOException e) {

         e.printStackTrace();
      }
      setCameraDisplayOrientation(this,CameraInfo.CAMERA_FACING_BACK,mCamera);
      mCamera.startPreview();//啟動相機預覽

   }

 public void setCameraDisplayOrientation(Activity activity,
                                       int cameraId, android.hardware.Camera camera) {
           android.hardware.Camera.CameraInfo info =
                   new android.hardware.Camera.CameraInfo();
           android.hardware.Camera.getCameraInfo(cameraId, info);
           int rotation = activity.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;
          }
           if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
             result = (info.orientation + degrees) % 360;
             result = (360 - result) % 360;  // compensate the mirror
             Log.d("-----------result---------------",result+"");
          } else {  // back-facing
             result = (info.orientation - degrees + 360) % 360;
             Log.d("-----------result---------------",result+"");
          }
      camera.setDisplayOrientation(result);
   }


   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
      getMenuInflater().inflate(R.menu.main, menu);
      return true;
   }

   @Override
   public void onClick(View view) {
      int id = view.getId();
      switch (id) {
      case R.id.start:

         if(mIsRecording==false) {
            mIsRecording=true;
            recorder();
            Log.d("URL",SD_CARD_TEMP_DIR);
         }else{
            stopmediaRecorder();
            finish();
         }
         if(mIsRecording){
            startButton.setText("stop");
            mIsRecording = true;
         }else {
            startButton.setText("start");
            mIsRecording = false;
         }
         break;
      default:
         break;
      }

   }

   private void stopmediaRecorder() {
      if(mediaRecorder!=null){
         if(mIsRecording){
            mediaRecorder.stop();
            mediaRecorder.release();
            mediaRecorder = null;
            releaseCamera();
         }
      }
   }

   public static String getSDPath() {//擷取sd卡路徑
      File sdDir = null;
      boolean sdCardExist = Environment.getExternalStorageState().equals(
            Environment.MEDIA_MOUNTED);
      if (sdCardExist) {
         sdDir = Environment.getExternalStorageDirectory();
      } else {
         return null;
      }
      return sdDir.toString();
   }

   public void recorder() {
      try {
         mCamera.unlock();//解鎖相機允許另一個程序通路它
         mediaRecorder = new MediaRecorder();
         mediaRecorder.reset();//mediarecorder重新開機其空閑狀态.在調用
         myRecAudioFile = File.createTempFile("video", ".mp4", dir);
         mediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
         mediaRecorder.setCamera(mCamera);
         mediaRecorder.setMaxDuration(10000000);//設定視屏最長時間機關ms
         mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 音麥
         mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);// 視訊源
         mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);// 輸出格式
         mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);// 聲音源碼
         mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);// 視訊源碼
         mediaRecorder.setVideoSize(height,width);//設定要捕獲的視訊的寬度和高度

//       switch (result){//後置攝像頭調用
//          case 0:result = 180;break;
//          case 180:result = 0;break;
//       }
         mediaRecorder.setOrientationHint(result);//設定輸出的視訊播放的方向提示
         mediaRecorder.setVideoFrameRate(30);//設定要捕獲的視訊的幀速率.必須先調用setvideosource()方法.
         mediaRecorder.setVideoEncodingBitRate(3*800*800);//設定視訊編碼比特率
         mediaRecorder.setOutputFile(myRecAudioFile.getAbsolutePath());//設定輸出檔案
         mediaRecorder.prepare();//準備開始捕獲和編碼資料記錄器,必須在start()方法之前調用
         mediaRecorder.start();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }

   @Override
   public boolean onTouchEvent(MotionEvent event) {//螢幕觸摸事件
      if (event.getAction() == MotionEvent.ACTION_DOWN) {//按下時自動對焦
         mCamera.autoFocus(myAutoFocusCallback);
      }
      return true;
   }
}