您的位置:首页 > 移动开发 > Android开发

Android:录像

2015-10-10 09:30 671 查看

方法一:调用系统录像功能



import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.widget.Toast;

import java.io.File;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

/**
* 调用系统的录像功能
*/
Intent intent = new Intent(
MediaStore.ACTION_VIDEO_CAPTURE);// 录像不能传入路径,否则无法拍摄
startActivityForResult(intent, 1);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (resultCode != Activity.RESULT_OK) {
return;
}
switch (requestCode) {
case 1:
File fromFile = getMediaFile(intent.getData(), this);
Toast.makeText(this, "录像保存在" + fromFile.getAbsolutePath(), Toast.LENGTH_LONG).show();
break;
default:
break;
}
}

private static File getMediaFile(Uri data, Activity ctx) {
if (data == null) {
return null;
}
String[] proj = {"_data"};
Cursor cursor = ctx.managedQuery(data, proj, null, null, null);
if (cursor == null) {
return null;
}
int index = cursor.getColumnIndex("_data");
if (index == -1) {
return null;
}
cursor.moveToFirst();
String mediaFilePath = cursor.getString(index);
File mediaFile = new File(mediaFilePath);
return mediaFile;
}
}


方法二:使用MediaRecorder录制视频







activity_media_recorder.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<Spinner
android:layout_width="match_parent"
android:layout_height="30dp"
android:id="@+id/spinner_size"
android:background="#1100FF00" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:orientation="horizontal">

<Button
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="Start"
android:id="@+id/button_start"
android:layout_weight="1"/>

<Button
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="Stop"
android:id="@+id/button_stop"
android:layout_weight="1"/>

<Button
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="Back"
android:id="@+id/button_back"
android:layout_weight="1" />
</LinearLayout>

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/textView_time"
android:textSize="16sp"/>

<SurfaceView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/surfaceView"
android:layout_margin="5dp"/>

</LinearLayout>


MediaRecorderDemoActivity.java

import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.hardware.Camera;
import android.hardware.Camera.Size;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemSelectedListener;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class MediaRecorderDemoActivity extends Activity implements SurfaceHolder.Callback {

private Button button_start;
private Button button_stop;
private Button button_back;
private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;
private File storageDir;
private File tempFile;
private MediaRecorder mediaRecorder;
private Camera camera;
private Spinner spinner;
private int width;
private int height;
private int hou;
private int min;
private int sec;
private Handler handler;
private TextView textView_time;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

this.requestWindowFeature(Window.FEATURE_NO_TITLE); // no title
//screen orientation landscape
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setContentView(R.layout.activity_media_recorder);

button_start = (Button)this.findViewById(R.id.button_start);
button_stop = (Button)this.findViewById(R.id.button_stop);
button_back = (Button)this.findViewById(R.id.button_back);
surfaceView = (SurfaceView)this.findViewById(R.id.surfaceView);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(MediaRecorderDemoActivity.this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
spinner = (Spinner)this.findViewById(R.id.spinner_size);
width = 480;
height = 320;
handler = new Handler();
textView_time = (TextView)this.findViewById(R.id.textView_time);

button_start.setOnClickListener(btnStartListener);
button_stop.setOnClickListener(btnStopListener);
button_back.setOnClickListener(btnBackListener);
spinner.setOnItemSelectedListener(spinnerListener);

/**
* 存储路径
*/
boolean sdCardExist = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
if (sdCardExist) {
storageDir = new File(Environment.getExternalStorageDirectory().toString() + File.separator + "Demo" + File.separator);
if (!storageDir.exists()) {
storageDir.mkdir();
}
button_stop.setVisibility(View.GONE);
} else {
button_start.setVisibility(View.GONE);
Toast.makeText(MediaRecorderDemoActivity.this, "SDcard is not exist", Toast.LENGTH_LONG).show();
}
}

private View.OnClickListener btnStartListener = new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
button_start.setVisibility(View.GONE);
button_stop.setVisibility(View.VISIBLE);
spinner.setVisibility(View.GONE);

/**
* 刷新录像时长
*/
hou = 0;
min = 0;
sec = 0;
handler.postDelayed(refreshTime, 1000);

try {
tempFile = File.createTempFile("Demo", ".3gp", storageDir);
mediaRecorder = new MediaRecorder();
mediaRecorder.setCamera(camera);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mediaRecorder.setVideoSize(width, height);
mediaRecorder.setVideoFrameRate(16);
mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());
mediaRecorder.setOutputFile(tempFile.getAbsolutePath());
mediaRecorder.prepare();
mediaRecorder.start();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};

private View.OnClickListener btnStopListener = new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
button_start.setVisibility(View.VISIBLE);
button_stop.setVisibility(View.GONE);
spinner.setVisibility(View.VISIBLE);

handler.removeCallbacks(refreshTime);

if (mediaRecorder != null) {
try {
mediaRecorder.stop();
mediaRecorder.release();
Log.e("Demo", tempFile.getAbsolutePath());
} catch(RuntimeException e) {
Log.e("Demo", e.getMessage());
}
}
}
};

private View.OnClickListener btnBackListener = new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
finish();
}
};

private OnItemSelectedListener spinnerListener = new Spinner.OnItemSelectedListener() {

@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
Spinner spinner = (Spinner)arg0;
String wh[] = spinner.getSelectedItem().toString().split("\\*");
width = Integer.parseInt(wh[0]);
height = Integer.parseInt(wh[1]);
try {
camera.lock();
camera.stopPreview();
Camera.Parameters para = camera.getParameters();
para.setPreviewSize(width, height);
camera.setParameters(para);
//                surfaceHolder.setFixedSize(width, height);
camera.setPreviewDisplay(surfaceHolder);
camera.startPreview();

Log.d("Demo", camera.getParameters().getPreviewSize().width + "*"
+ camera.getParameters().getPreviewSize().height);

camera.unlock();
} catch (IOException e) {
// TODO Auto-generated catch block
Log.e("Demo", e.getMessage());
}
}

@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub

}

};

private Runnable refreshTime = new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
sec++;
handler.postDelayed(refreshTime, 1000);
if (sec >= 60) {
sec = sec % 60;
min++;
}
if (min >= 60) {
min = min % 60;
hou++;
}
textView_time.setText(timeFormat(hou) + ":" + timeFormat(min) + ":" + timeFormat(sec));
}
};

private String timeFormat(int t) {
if (t / 10 == 0) {
return "0" + t;
} else {
return t + "";
}
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub

}

@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
camera = Camera.open();
List<Size> supportedSize = camera.getParameters().getSupportedPreviewSizes();
if (supportedSize != null) {
List<String> list = new ArrayList<String>();
for (Size s: supportedSize) {
list.add(s.width + "*" + s.height);
}
//            list.add(0, "1000*800");//不允许自定义分辨率
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MediaRecorderDemoActivity.this,
android.R.layout.simple_spinner_dropdown_item, list);
spinner.setAdapter(adapter);
}
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
camera.release();
}
}


AndroidManifest.xml

<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


参考:/article/8333220.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: