閑着無聊寫的一個測試相機,查了各種資料希望對大家有幫助.
需要完整工程的可以到: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;
}
}