android手机设备提供了很多的硬件供用户操作,也提供了很多的api接口供程序员调用,由java代码调用c代码进而驱动硬件设备,如此精巧的一个设备,如此精巧的一套实现方案。
就像单片机控制需要设置很多参数一样 ,android调用硬件设备也要设置很多参数,参数也叫选项,可以以各种方式来控制硬件或内存,或文件等。
1:录音
如下是一个简单的android录音代码。仅供参考:
private MediaRecorder mMediaRecorder; mMediaRecorder = new MediaRecorder(); mMediaRecorder .setAudioSource(MediaRecorder.AudioSource.MIC); mMediaRecorder .setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); mMediaRecorder .setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); mMediaRecorder.setOutputFile(myRecAudioFile .getAbsolutePath()); mMediaRecorder.prepare(); mMediaRecorder.start();
从new一个实例到prepare之间的几行代码都是设置参数,同样可以设置其他参数以查看区别。prepare的意思就是说录音设备开始准备捕捉声音输入设备的数据并准备编码该数据,意味着一切准备就绪,只等开始的那一刻。prepare的具体代码见下:
/** * Prepares the recorder to begin capturing and encoding data. This method * must be called after setting up the desired audio and video sources, * encoders, file format, etc., but before start(). * * @throws IllegalStateException if it is called after * start() or before setOutputFormat(). * @throws IOException if prepare fails otherwise. */ public void prepare() throws IllegalStateException, IOException { if (mPath != null) { FileOutputStream fos = new FileOutputStream(mPath); try { _setOutputFile(fos.getFD(), 0, 0); } finally { fos.close(); } } else if (mFd != null) { _setOutputFile(mFd, 0, 0); } else { throw new IOException("No valid output file"); } _prepare(); }
可以明显的看出,在prepare的时候就需要一个文件以供输出,否则当开始录音才发现文件不可用等问题就太迟了,所以这时候必须做好准备。然后调用native方法:setOutFile 和 prepare,函数原型见下:
// native implementation private native void _setOutputFile(FileDescriptor fd, long offset, long length) throws IllegalStateException, IOException; private native void _prepare() throws IllegalStateException, IOException;
录音完毕后,停止录音设备,释放内存,如果单纯的停止掉,则录音设备还占用内存,相当于就绪状态,即不合理状态。
mMediaRecorder.stop();
mMediaRecorder.release();
mMediaRecorder = null;
源码release的解释如此:
/** * Releases resources associated with this MediaRecorder object. * It is good practice to call this method when you're done * using the MediaRecorder. */ public native void release();
MediaRecorder原生代码中的使用说明如下:
A common case of using MediaRecorder to record audio works as follows: MediaRecorder recorder = new MediaRecorder(); recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); recorder.setOutputFile(PATH_NAME); recorder.prepare(); recorder.start(); // Recording is now started ... recorder.stop(); recorder.reset(); // You can reuse the object by going back to setAudioSource() step recorder.release(); // Now the object cannot be reused
2:录视频
录制视频也是对MediaRecorder的参数的一些调整,代码如下:
开始录制视频,需要提供文件路径,如需预览视频画面,可以提供surface,这样就可以边录边看。
MediaRecorder recorder = null; File outFile = new File(OUTPUT_FILE); if (outFile.exists()) { outFile.delete(); } try { recorder = new MediaRecorder(); recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); recorder.setVideoSize(480, 320); recorder.setVideoFrameRate(15); recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); recorder.setPreviewDisplay(holder.getSurface()); recorder.setOutputFile(OUTPUT_FILE); recorder.prepare(); recorder.start(); } catch (Exception e) { e.printStackTrace(); }
停止录制视频同上:
if (recorder != null) { recorder.stop(); recorder.release(); }
别忘记添加权限,不过如果忘记添加权限,运行会提示操作缺少权限的,也容易定位,平时只要记住常用权限就可以了吧。
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />