Audio系统在Android中负责音频方面输入/输出层次,一般负责播放PCM声音输出和从外部获取PCM声音,以及管理声音设备和设置。这里主要是谈谈其中录制这块:AudioRecorder。 相对于MediaRecorder来说,AudioRecorder更接近底层,为我们封装的方法也更少。而且音频的采样率、声道等等都可以参数配置,但是问题是在模拟器中AudioRecorder却不怎么好用。
关于Audio系统中其它几个类,如AudioCapture、AudioPlayer,也可以在rexsee的开源社区里找到: http://www.rexsee.com/CN/helpReference.php
【函数】 void record() 【说明】 录制音频。录制成功触发事件onRecordAudioSuccessed,失败则触发onRecordAudioFailed。 【返回】 无 【示例】
rexseeAudioRecorder.record();

【函数】 void upload(String action,String name) 【说明】 将录制好的音频直接上传,通常在onRecordAudioSuccessed事件中调用。 【返回】 无 【参数】 action:上传的服务器程序url,等同于HTML中<form action="......">中的action。 name:上传名称,等同于HTML中<input type="file" name="......">中的name。 action指向的服务器程序和HTML中表单对应的程序相同,示例的服务器程序参见rexseeUpload对象。
rexseeAudioRecorder.java源码。。
/* * Copyright (C) 2011 The Rexsee Open Source Project * * Licensed under the Rexsee License, Version 1.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.rexsee.com/CN/legal/license.html * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */  package rexsee.multimedia;   import rexsee.core.browser.ActivityResult.ActivityResultListener;  import rexsee.core.browser.JavascriptInterface;  import rexsee.core.browser.RexseeBrowser;  import rexsee.core.browser.UrlListener;  import rexsee.core.lang.RexseeLanguage;  import rexsee.core.transportation.RexseeUpload;  import android.app.Activity;  import android.content.ContentResolver;  import android.content.Context;  import android.content.Intent;  import android.database.Cursor;  import android.net.Uri;  import android.provider.MediaStore.Audio.Media;   public class RexseeAudioRecorder implements JavascriptInterface {          private static final String INTERFACE_NAME = "AudioRecorder";         @Override         public String getInterfaceName() {                 return mBrowser.application.resources.prefix + INTERFACE_NAME;         }         @Override         public JavascriptInterface getInheritInterface(RexseeBrowser childBrowser) {                 return this;         }         @Override         public JavascriptInterface getNewInterface(RexseeBrowser childBrowser) {                 return new RexseeAudioRecorder(childBrowser);         }          public static final String EVENT_ONRECORDAUDIOSUCCESSED = "onRecordAudioSuccessed";         public static final String EVENT_ONRECORDAUDIOFAILED = "onRecordAudioFailed";          public static final String URI_MEDIA_AUDIO = "content://media/external/audio/media";          private String mediaFile = null;          private final RexseeBrowser mBrowser;          public RexseeAudioRecorder(RexseeBrowser browser) {                  mBrowser = browser;                 browser.eventList.add(EVENT_ONRECORDAUDIOSUCCESSED);                 browser.eventList.add(EVENT_ONRECORDAUDIOFAILED);                  browser.urlListeners.add(new UrlListener(mBrowser.application.resources.prefix + ":audio") {                         @Override                         public void run(Context context, final RexseeBrowser browser, final String url) {                                 new Thread() {                                         @Override                                         public void run() {                                                 String html = "<HTML><HEAD><TITLE>" + url + "</TITLE></HEAD>";                                                 html += "<BODY style='margin:0px;background-color:black;color:white;'>";                                                 ContentResolver contentResolver = mBrowser.getContext().getContentResolver();                                                 browser.progressDialog.show(RexseeLanguage.PROGRESS_ONGOING);                                                 Cursor cursor = contentResolver.query(Uri.parse(URI_MEDIA_AUDIO), new String[]{"_id", "_data"}, null, null, "_id desc");                                                 html += "<table width=100% cellspacing=0 style='color:white;font-size:16px;'>";                                                 if (cursor.getCount() == 0) {                                                         html += "<tr><td style='padding:10px;'> audio found.</td></tr>";                                                 } else {                                                         for (int i = 0; i < cursor.getCount(); i++) {                                                                 cursor.moveToPosition(i);                                                                 html += "<tr><td onclick=\"" + browser.function.getInterfaceName() + ".go('" + URI_MEDIA_AUDIO + "/" + cursor.getInt(0) + "');\" style='border-bottom:1px solid #222222; padding:10 5 10 5;word-break:break-all;'>" + cursor.getString(1) + "</td></tr>";                                                         }                                                 }                                                 cursor.close();                                                 html += "</table>";                                                 html += "</BODY>";                                                 html += "</HTML>";                                                 browser.function.loadHTMLWithoutHistory(html);                                         }                                 }.start();                         }                         @Override                         public boolean shouldAddToHistory(Context context, RexseeBrowser browser, String url) {                                 return true;                         }                 });          }          public String getLastMediaAudio() {                 ContentResolver contentResolver = mBrowser.getContext().getContentResolver();                 Cursor cursor = contentResolver.query(Uri.parse(URI_MEDIA_AUDIO), new String[]{"_data"}, null, null, "_id desc");                 if (cursor == null || cursor.getCount() == 0) return "";                 cursor.moveToFirst();                 String rtn = "file://" + cursor.getString(0);                 cursor.close();                 return rtn;         }          public void record() {                 try {                         Intent intent = new Intent(Media.RECORD_SOUND_ACTION);                         mBrowser.activityResult.start(intent, new ActivityResultListener() {                                 @Override                                 public void run(int resultCode, Intent resultIntent) {                                         if (resultCode == Activity.RESULT_OK) {                                                 mediaFile = getLastMediaAudio();                                                 mBrowser.eventList.run(EVENT_ONRECORDAUDIOSUCCESSED, new String[]{mediaFile});                                         } else {                                                 mediaFile = null;                                                 mBrowser.eventList.run(EVENT_ONRECORDAUDIOFAILED);                                         }                                 }                         });                 } catch (Exception e) {                         mBrowser.exception(getInterfaceName(), e);                 }         }          public void prepareUpload() {                 if (mediaFile == null) {                         mBrowser.exception(getInterfaceName(), "Audio is not ready.");                 } else {                         RexseeUpload uploadObject = (RexseeUpload) mBrowser.interfaceList.get(mBrowser.application.resources.prefix + RexseeUpload.INTERFACE_NAME);                         if (uploadObject == null) {                                 mBrowser.exception(getInterfaceName(), "Upload object is not ready.");                         } else {                                 uploadObject.selectedFiles.add(mediaFile);                         }                 }         }          public void upload(String action, String name) {                 if (mediaFile == null) {                         mBrowser.exception(getInterfaceName(), "Audio is not ready.");                 } else {                         RexseeUpload uploadObject = (RexseeUpload) mBrowser.interfaceList.get(mBrowser.application.resources.prefix + RexseeUpload.INTERFACE_NAME);                         if (uploadObject == null) {                                 mBrowser.exception(getInterfaceName(), "Upload object is not ready.");                         } else {                                 uploadObject.clear();                                 uploadObject.selectedFiles.add(mediaFile);                                 uploadObject.upload(action, name);                         }                 }         }   }

仅对Rexsee的源码和函数事件做了整理,相关的demo或源码解析可以在Rexsee社区了解,目前Rexsee已提供了近2000个扩展,覆盖Android原生功能超过90%,且全部开放: http://www.rexsee.com/

更多相关文章

  1. Android应用程序介绍页面实现 (二)
  2. Android(安卓)ContentResolver使用说明
  3. Android(安卓)Looper用法及原理
  4. android压力测试命令Monkey
  5. Android小项目之七 应用程序的更新安装
  6. 我的Android学习之旅[1]——Android的系统架构
  7. android ios 在浏览器中自定义URL
  8. Android(安卓)Studio中JNI程序的单步调试和日志打印
  9. android log丢失(三)动态切换logd机制和kernel机制

随机推荐

  1. android Animation的xml的编写
  2. android 退出程序三种方法及两种形式
  3. 【持续更新】Android(安卓)Studio各种疑
  4. cocos2dx2.2移植到Android
  5. Android(安卓)保存图片到Sqlite数据库
  6. 当忘记Android发布签名和别名的时候
  7. 安卓入门(八)
  8. Gradle在Android中的简单使用
  9. android Audio 详解( 一 )
  10. 《Android学习指南》目录