我做毕业设计时候需要实现先拍摄后上传的功能,还要支持多分辨率,虽然MediaRecorder的教程很丰富,但是实现起来却一波三折,这里记录下来的代码也只是在我自己的2.3的Android上跑起来没有问题。在有些Moto的机子上会失败,具体原因还未分析出来。

直接上代码:根据MediaRecorder的状态

package net.john.media;import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.List;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;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;    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);                this.requestWindowFeature(Window.FEATURE_NO_TITLE); // no title        //screen orientation landscapethis.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);        setContentView(R.layout.main);                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() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubbutton_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 blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}; private View.OnClickListener btnStopListener = new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubbutton_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() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubfinish();}};private OnItemSelectedListener spinnerListener = new Spinner.OnItemSelectedListener() {@Overridepublic void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,long arg3) {// TODO Auto-generated method stubSpinner 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);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 blockLog.e("Demo", e.getMessage());}}@Overridepublic void onNothingSelected(AdapterView<?> arg0) {// TODO Auto-generated method stub}};private Runnable refreshTime = new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubsec++;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 + "";}}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {// TODO Auto-generated method stub}@Overridepublic void surfaceCreated(SurfaceHolder holder) {// TODO Auto-generated method stubcamera = 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.remove(0); // 在使用G7的摄像头支持的最大分辨率进行拍摄的时候会出现stop failed错误,无法关闭MediaRecorder,原因不明!ArrayAdapter<String> adapter = new ArrayAdapter<String>(MediaRecorderDemoActivity.this, android.R.layout.simple_spinner_dropdown_item, list);spinner.setAdapter(adapter);}}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {// TODO Auto-generated method stubcamera.release();}}

三个权限:

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



更多相关文章

  1. Android通过Service编程实现短信监听,通过Toast显示收到的短信的
  2. Android通过WebView实现office文档在线预览无法显示问题解决
  3. Android(安卓)中的依赖注入框架
  4. Android(安卓)Studio Intent使用(显式、隐式) 第一行代码
  5. 运用smali自动注入技术分析android应用程序行为
  6. [Android(安卓)实例] 史上最全的Android的Tab与TabHost讲解
  7. 新浪微博布局学习――妙用TabHost
  8. Android中控件绕中心旋转动画
  9. Android入门第一篇[转]

随机推荐

  1. Android Timer 实现方法
  2. android解压ZIP文件
  3. 获取Android各种系统信息
  4. 【实用工具】adb检测android设备
  5. Android Camera2 API 学习
  6. Android(安卓)最佳实践
  7. android 让 webView 中的超链接失效
  8. Android中MAC地址获取代码
  9. Android动态权限判断以及动态权限申请
  10. android工程引入第三方jar包,如果发现混淆