//實現了自動錄像,但仍有部分需要更改
代碼如下:
在AndroidManifest.xml添加下面的權限:
- <uses-permission android:name="android.permission.CAMERA" />
- <uses-permission android:name="android.permission.RECORD_AUDIO" />
- <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
- <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
- <!-- 硬件支持 -->
- <uses-feature android:name="android.hardware.camera"/>
- <uses-feature android:name="android.hardware.camera.autofocus"/>
- <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" >
- <SurfaceView
- android:id="@+id/camera_preview"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentTop="true"
- android:layout_centerHorizontal="true"
- android:orientation="horizontal">
- <TextView
- android:id="@+id/timestamp_minute_prefix"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textColor="#7F00FF"
- android:textSize="30sp"
- android:text="0"/>
- <TextView
- android:id="@+id/timestamp_minute_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textColor="#7F00FF"
- android:textSize="30sp"
- android:text="0"/>
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textColor="#7F00FF"
- android:textSize="30sp"
- android:text=":"/>
- <TextView
- android:id="@+id/timestamp_second_prefix"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textColor="#7F00FF"
- android:textSize="30sp"
- android:text="0"/>
- <TextView
- android:id="@+id/timestamp_second_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textColor="#7F00FF"
- android:textSize="30sp"
- android:text="0"/>
- </LinearLayout>
- <ImageButton
- android:id="@+id/record_shutter"
- android:layout_width="64dp"
- android:layout_height="64dp"
- android:layout_alignParentBottom="true"
- android:layout_centerHorizontal="true"
- android:layout_marginBottom="15dp"
- android:background="@android:color/transparent"
- android:scaleType="centerCrop"
- android:src="@drawable/recording_shutter" />
- </RelativeLayout>
//實現了定時拍攝視頻
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import java.io.File;
import android.app.Activity;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.hardware.Camera.Size;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Display;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.TextView;
import org.w3c.dom.Text;
public class MainActivity extends Activity implements OnClickListener {
private SurfaceView mCameraPreview;
private SurfaceHolder mSurfaceHolder;
private ImageButton mShutter;
private TextView mMinutePrefix;
private TextView mMinuteText;
private TextView mSecondPrefix;
private TextView mSecondText;
private Camera mCamera;
private MediaRecorder mRecorder;
private final static int CAMERA_ID = 0;
private boolean mIsRecording = false;
private boolean mIsSufaceCreated = false;
private static final String TAG = "Jackie";
private Handler mHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mCameraPreview = (SurfaceView) findViewById(R.id.camera_preview);
mMinutePrefix = (TextView) findViewById(R.id.timestamp_minute_prefix);
mMinuteText = (TextView) findViewById(R.id.timestamp_minute_text);
mSecondPrefix = (TextView) findViewById(R.id.timestamp_second_prefix);
mSecondText = (TextView) findViewById(R.id.timestamp_second_text);
mSurfaceHolder = mCameraPreview.getHolder();
mSurfaceHolder.addCallback(mSurfaceCallback);
mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
mShutter = (ImageButton) findViewById(R.id.record_shutter);
mShutter.setOnClickListener(this);
//開始錄像後,每隔1s去更新錄像的時間戳
mHandler.postDelayed(mTimestampRunnable, 5000);
}
@Override
protected void onPause() {
super.onPause();
if (mIsRecording) {
stopRecording();
}
stopPreview();
}
private SurfaceHolder.Callback mSurfaceCallback = new SurfaceHolder.Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mIsSufaceCreated = false;
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
mIsSufaceCreated = true;
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
startPreview();
}
};
//啓動預覽
private void startPreview() {
//保證只有一個Camera對象
if (mCamera != null || !mIsSufaceCreated) {
Log.d(TAG, "startPreview will return");
return;
}
mCamera = Camera.open(CAMERA_ID);
Parameters parameters = mCamera.getParameters();
// 獲取窗口管理器
WindowManager wm = getWindowManager();
Display display = wm.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
// 獲取屏幕的寬和高
display.getMetrics(metrics);
int screenWidth1 = metrics.widthPixels;
int screenHeight1 = metrics.heightPixels;
Size size = getBestPreviewSize(screenWidth1, screenHeight1, parameters);
if (size != null) {
parameters.setPreviewSize(size.width, size.height);
}
parameters.setFocusMode(Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
parameters.setPreviewFrameRate(20);
//設置相機預覽方向
mCamera.setDisplayOrientation(90);
mCamera.setParameters(parameters);
try {
mCamera.setPreviewDisplay(mSurfaceHolder);
// mCamera.setPreviewCallback(mPreviewCallback);
} catch (Exception e) {
Log.d(TAG, e.getMessage());
}
mCamera.startPreview();
}
private void stopPreview() {
//釋放Camera對象
if (mCamera != null) {
try {
mCamera.setPreviewDisplay(null);
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}
private Camera.Size getBestPreviewSize(int width, int height, Camera.Parameters parameters) {
Camera.Size result = null;
for (Camera.Size size : parameters.getSupportedPreviewSizes()) {
if (size.width <= width && size.height <= height) {
if (result == null) {
result = size;
} else {
int resultArea = result.width * result.height;
int newArea = size.width * size.height;
if (newArea > resultArea) {
result = size;
}
}
}
}
return result;
}
@Override
public void onClick(View v) {
initMediaRecorder();
startRecording();
/* if (mIsRecording) {
stopRecording();
} else {
initMediaRecorder();
startRecording();
//開始錄像後,每隔1s去更新錄像的時間戳
mHandler.postDelayed(mTimestampRunnable, 1000);
} */
}
private void initMediaRecorder() {
mRecorder = new MediaRecorder();//實例化
mCamera.unlock();
//給Recorder設置Camera對象,保證錄像跟預覽的方向保持一致
mRecorder.setCamera(mCamera);
mRecorder.setOrientationHint(90); //改變保存後的視頻文件播放時是否橫屏(不加這句,視頻文件播放的時候角度是反的)
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 設置從麥克風採集聲音
mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // 設置從攝像頭採集圖像
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); // 設置視頻的輸出格式 爲MP4
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); // 設置音頻的編碼格式
mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); // 設置視頻的編碼格式
mRecorder.setVideoSize(176, 144); // 設置視頻大小
mRecorder.setVideoFrameRate(20); // 設置幀率
// mRecorder.setMaxDuration(10000); //設置最大錄像時間爲10s
mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
//設置視頻存儲路徑
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES) + File.separator + "VideoRecorder");
if (!file.exists()) {
//多級文件夾的創建
file.mkdirs();
}
mRecorder.setOutputFile(file.getPath() + File.separator + "VID_" + System.currentTimeMillis() + ".mp4");
}
private void startRecording() {
if (mRecorder != null) {
try {
mRecorder.prepare();
mRecorder.start();
} catch (Exception e) {
mIsRecording = false;
Log.e(TAG, e.getMessage());
}
}
mShutter.setImageDrawable(getResources().getDrawable(R.drawable.recording_shutter_hl));
mIsRecording = true;
}
private void stopRecording() {
if (mCamera != null) {
mCamera.lock();
}
if (mRecorder != null) {
mRecorder.stop();
mRecorder.release();
mRecorder = null;
}
mShutter.setImageDrawable(getResources().getDrawable(R.drawable.recording_shutter));
mIsRecording = false;
// mHandler.removeCallbacks(mTimestampRunnable);
//將錄像時間還原
mMinutePrefix.setVisibility(View.VISIBLE);
mMinuteText.setText("0");
mSecondPrefix.setVisibility(View.VISIBLE);
mSecondText.setText("0");
//重啓預覽
startPreview();
}
private Runnable mTimestampRunnable = new Runnable() {
@Override
public void run() {
//stopRecording();
startPreview();
// mIsSufaceCreated = true;
initMediaRecorder();
startRecording();
/* updateTimestamp();
mHandler.postDelayed(this, 1000); */
}
};
private void updateTimestamp() {
int second = Integer.parseInt(mSecondText.getText().toString());
int minute = Integer.parseInt(mMinuteText.getText().toString());
second++;
Log.d(TAG, "second: " + second);
if (second < 10) {
mSecondText.setText(String.valueOf(second));
} else if (second >= 10 && second < 60) {
mSecondPrefix.setVisibility(View.GONE);
mSecondText.setText(String.valueOf(second));
} else if (second >= 60) {
mSecondPrefix.setVisibility(View.VISIBLE);
mSecondText.setText("0");
minute++;
mMinuteText.setText(String.valueOf(minute));
} else if (minute >= 60) {
mMinutePrefix.setVisibility(View.GONE);
}
}
}