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
相关文章推荐
- android 线程池
- 安卓中通知(Notification)的基本使用方法
- Android TextView 属性XML详解
- Android用JavaMail发送邮件
- Android2.2 Socket关闭Bug的解决方…
- Android开发之中文语音朗读
- Android 中 Fragment的使用大全
- android:inputType常用取值
- android drawable
- android drawable
- android drawable
- 修改Android模拟器的system分区,以及加入SuperSU
- 50 android hacks(hack 16)
- android dnk 引导
- android 中ListView中的adapter详解
- Android自定义view之绘制实用型的柱形图和折线图
- Android listview与adapter用法
- android 定位
- android之4.0的系统主题style修改android:Theme.Holo.Light
- Android 项目(详解一)——项目流程