查看: 1559|回复: 0
打印 上一主题 下一主题

Android多媒体功能之;AudioRecorder音频录制实现,Rexsee源码

[复制链接]
跳转到指定楼层
沙发
发表于 2015-4-12 15:30:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

udio系统在Android中负责音频方面输入/输出层次,一般负责播放PCM声音输出和从外部获取PCM声音,以及管理声音设备和设置。这里主要是谈谈其中录制这块:AudioRecorder。
相对于MediaRecorder来说,AudioRecorder更接近底层,为我们封装的方法也更少。而且音频的采样率、声道等等都可以参数配置,但是问题是在模拟器中AudioRecorder却不怎么好用。

Rexsee实现这个类的方法倒真的很值得学习研究。关于Audio系统中其它几个类,如AudioCapture、AudioPlayer,也可以在rexsee的开源社区里找到,全部开放的:http://www.rexsee.com/CN/helpReference.php

如下是源码。。

[size=1em][backcolor=rgb(108, 226, 108) !important]
[color=white !important][size=1em]?

[size=1em]1

[size=1em]2

[size=1em]3

[size=1em]4

[size=1em]5

[size=1em]6

[size=1em]7

[size=1em]8

[size=1em]9

[size=1em]10

[size=1em]11

[size=1em]12

[size=1em]13

[size=1em]14

[size=1em]15

[size=1em]16

[size=1em]17

[size=1em]18

[size=1em]19

[size=1em]20

[size=1em]21

[size=1em]22

[size=1em]23

[size=1em]24

[size=1em]25

[size=1em]26

[size=1em]27

[size=1em]28

[size=1em]29

[size=1em]30

[size=1em]31

[size=1em]32

[size=1em]33

[size=1em]34

[size=1em]35

[size=1em]36

[size=1em]37

[size=1em]38

[size=1em]39

[size=1em]40

[size=1em]41

[size=1em]42

[size=1em]43

[size=1em]44

[size=1em]45

[size=1em]46

[size=1em]47

[size=1em]48

[size=1em]49

[size=1em]50

[size=1em]51

[size=1em]52

[size=1em]53

[size=1em]54

[size=1em]55

[size=1em]56

[size=1em]57

[size=1em]58

[size=1em]59

[size=1em]60

[size=1em]61

[size=1em]62

[size=1em]63

[size=1em]64

[size=1em]65

[size=1em]66

[size=1em]67

[size=1em]68

[size=1em]69

[size=1em]70

[size=1em]71

[size=1em]72

[size=1em]73

[size=1em]74

[size=1em]75

[size=1em]76

[size=1em]77

[size=1em]78

[size=1em]79

[size=1em]80

[size=1em]81

[size=1em]82

[size=1em]83

[size=1em]84

[size=1em]85

[size=1em]86

[size=1em]87

[size=1em]88

[size=1em]89

[size=1em]90

[size=1em]91

[size=1em]92

[size=1em]93

[size=1em]94

[size=1em]95

[size=1em]96

[size=1em]97

[size=1em]98

[size=1em]99

[size=1em]100

[size=1em]101

[size=1em]102

[size=1em]103

[size=1em]104

[size=1em]105

[size=1em]106

[size=1em]107

[size=1em]108

[size=1em]109

[size=1em]110

[size=1em]111

[size=1em]112

[size=1em]113

[size=1em]114

[size=1em]115

[size=1em]116

[size=1em]117

[size=1em]118

[size=1em]119

[size=1em]120

[size=1em]121

[size=1em]122

[size=1em]123

[size=1em]124

[size=1em]125

[size=1em]126

[size=1em]127

[size=1em]128

[size=1em]129

[size=1em]130

[size=1em]131

[size=1em]132

[size=1em]133

[size=1em]134

[size=1em]135

[size=1em]136

[size=1em]137

[size=1em]138

[size=1em]139

[size=1em]140

[size=1em]141

[size=1em]142

[size=1em]143

[size=1em]144

[size=1em]145

[size=1em]146

[size=1em]147

[size=1em]148

[size=1em]149

[size=1em]150

[size=1em]151

[size=1em]152

[size=1em]153

[size=1em]154

[size=1em]155

[size=1em]156

[size=1em]157

[size=1em]158

[size=1em][size=1em]/*
[size=1em]* Copyright (C) 2011 The Rexsee Open Source Project
[size=1em]*
[size=1em]* Licensed under the Rexsee License, Version 1.0 (the "License");
[size=1em]* you may not use this file except in compliance with the License.
[size=1em]* You may obtain a copy of the License at
[size=1em]*
[size=1em]*      http://www.rexsee.com/CN/legal/license.html
[size=1em]*
[size=1em]* Unless required by applicable law or agreed to in writing, software
[size=1em]* distributed under the License is distributed on an "AS IS" BASIS,
[size=1em]* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
[size=1em]* See the License for the specific language governing permissions and
[size=1em]* limitations under the License.
[size=1em]*/
[size=1em]  
[size=1em]package rexsee.multimedia;  
[size=1em]  
[size=1em]import rexsee.core.browser.ActivityResult.ActivityResultListener;  
[size=1em]import rexsee.core.browser.JavascriptInterface;  
[size=1em]import rexsee.core.browser.RexseeBrowser;  
[size=1em]import rexsee.core.browser.UrlListener;  
[size=1em]import rexsee.core.lang.RexseeLanguage;  
[size=1em]import rexsee.core.transportation.RexseeUpload;  
[size=1em]import android.app.Activity;  
[size=1em]import android.content.ContentResolver;  
[size=1em]import android.content.Context;  
[size=1em]import android.content.Intent;  
[size=1em]import android.database.Cursor;  
[size=1em]import android.net.Uri;  
[size=1em]import android.provider.MediaStore.Audio.Media;  
[size=1em]  
[size=1em]public class RexseeAudioRecorder implements JavascriptInterface {  
[size=1em]  
[size=1em]       private static final String INTERFACE_NAME = "AudioRecorder";  
[size=1em]       @Override
[size=1em]       public String getInterfaceName() {  
[size=1em]               return mBrowser.application.resources.prefix + INTERFACE_NAME;  
[size=1em]       }  
[size=1em]       @Override
[size=1em]       public JavascriptInterface getInheritInterface(RexseeBrowser childBrowser) {  
[size=1em]               return this;  
[size=1em]       }  
[size=1em]       @Override
[size=1em]       public JavascriptInterface getNewInterface(RexseeBrowser childBrowser) {  
[size=1em]               return new RexseeAudioRecorder(childBrowser);  
[size=1em]       }  
[size=1em]  
[size=1em]       public static final String EVENT_ONRECORDAUDIOSUCCESSED = "onRecordAudioSuccessed";  
[size=1em]       public static final String EVENT_ONRECORDAUDIOFAILED = "onRecordAudioFailed";  
[size=1em]  
[size=1em]       public static final String URI_MEDIA_AUDIO = "content://media/external/audio/media";  
[size=1em]  
[size=1em]       private String mediaFile = null;  
[size=1em]  
[size=1em]       private final RexseeBrowser mBrowser;  
[size=1em]  
[size=1em]       public RexseeAudioRecorder(RexseeBrowser browser) {  
[size=1em]  
[size=1em]               mBrowser = browser;  
[size=1em]               browser.eventList.add(EVENT_ONRECORDAUDIOSUCCESSED);  
[size=1em]               browser.eventList.add(EVENT_ONRECORDAUDIOFAILED);  
[size=1em]  
[size=1em]               browser.urlListeners.add(new UrlListener(mBrowser.application.resources.prefix + ":audio") {  
[size=1em]                       @Override
[size=1em]                       public void run(Context context, final RexseeBrowser browser, final String url) {  
[size=1em]                               new Thread() {  
[size=1em]                                       @Override
[size=1em]                                       public void run() {  
[size=1em]                                               String html = "<HTML><HEAD><TITLE>" + url + "</TITLE></HEAD>";  
[size=1em]                                               html += "<BODY style='margin:0px;background-color:black;color:white;'>";  
[size=1em]                                               ContentResolver contentResolver = mBrowser.getContext().getContentResolver();  
[size=1em]                                               browser.progressDialog.show(RexseeLanguage.PROGRESS_ONGOING);  
[size=1em]                                               Cursor cursor = contentResolver.query(Uri.parse(URI_MEDIA_AUDIO), new String[]{"_id", "_data"}, null, null, "_id desc");  
[size=1em]                                               html += "<table width=100% cellspacing=0 style='color:white;font-size:16px;'>";  
[size=1em]                                               if (cursor.getCount() == 0) {  
[size=1em]                                                       html += "<tr><td style='padding:10px;'> audio found.</td></tr>";  
[size=1em]                                               } else {  
[size=1em]                                                       for (int i = 0; i < cursor.getCount(); i++) {  
[size=1em]                                                               cursor.moveToPosition(i);  
[size=1em]                                                               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>";  
[size=1em]                                                       }  
[size=1em]                                               }  
[size=1em]                                               cursor.close();  
[size=1em]                                               html += "</table>";  
[size=1em]                                               html += "</BODY>";  
[size=1em]                                               html += "</HTML>";  
[size=1em]                                               browser.function.loadHTMLWithoutHistory(html);  
[size=1em]                                       }  
[size=1em]                               }.start();  
[size=1em]                       }  
[size=1em]                       @Override
[size=1em]                       public boolean shouldAddToHistory(Context context, RexseeBrowser browser, String url) {  
[size=1em]                               return true;  
[size=1em]                       }  
[size=1em]               });  
[size=1em]  
[size=1em]       }  
[size=1em]  
[size=1em]       public String getLastMediaAudio() {  
[size=1em]               ContentResolver contentResolver = mBrowser.getContext().getContentResolver();  
[size=1em]               Cursor cursor = contentResolver.query(Uri.parse(URI_MEDIA_AUDIO), new String[]{"_data"}, null, null, "_id desc");  
[size=1em]               if (cursor == null || cursor.getCount() == 0) return "";  
[size=1em]               cursor.moveToFirst();  
[size=1em]               String rtn = "file://" + cursor.getString(0);  
[size=1em]               cursor.close();  
[size=1em]               return rtn;  
[size=1em]       }  
[size=1em]  
[size=1em]       public void record() {  
[size=1em]               try {  
[size=1em]                       Intent intent = new Intent(Media.RECORD_SOUND_ACTION);  
[size=1em]                       mBrowser.activityResult.start(intent, new ActivityResultListener() {  
[size=1em]                               @Override
[size=1em]                               public void run(int resultCode, Intent resultIntent) {  
[size=1em]                                       if (resultCode == Activity.RESULT_OK) {  
[size=1em]                                               mediaFile = getLastMediaAudio();  
[size=1em]                                               mBrowser.eventList.run(EVENT_ONRECORDAUDIOSUCCESSED, new String[]{mediaFile});  
[size=1em]                                       } else {  
[size=1em]                                               mediaFile = null;  
[size=1em]                                               mBrowser.eventList.run(EVENT_ONRECORDAUDIOFAILED);  
[size=1em]                                       }  
[size=1em]                               }  
[size=1em]                       });  
[size=1em]               } catch (Exception e) {  
[size=1em]                       mBrowser.exception(getInterfaceName(), e);  
[size=1em]               }  
[size=1em]       }  
[size=1em]  
[size=1em]       public void prepareUpload() {  
[size=1em]               if (mediaFile == null) {  
[size=1em]                       mBrowser.exception(getInterfaceName(), "Audio is not ready.");  
[size=1em]               } else {  
[size=1em]                       RexseeUpload uploadObject = (RexseeUpload) mBrowser.interfaceList.get(mBrowser.application.resources.prefix + RexseeUpload.INTERFACE_NAME);  
[size=1em]                       if (uploadObject == null) {  
[size=1em]                               mBrowser.exception(getInterfaceName(), "Upload object is not ready.");  
[size=1em]                       } else {  
[size=1em]                               uploadObject.selectedFiles.add(mediaFile);  
[size=1em]                       }  
[size=1em]               }  
[size=1em]       }  
[size=1em]  
[size=1em]       public void upload(String action, String name) {  
[size=1em]               if (mediaFile == null) {  
[size=1em]                       mBrowser.exception(getInterfaceName(), "Audio is not ready.");  
[size=1em]               } else {  
[size=1em]                       RexseeUpload uploadObject = (RexseeUpload) mBrowser.interfaceList.get(mBrowser.application.resources.prefix + RexseeUpload.INTERFACE_NAME);  
[size=1em]                       if (uploadObject == null) {  
[size=1em]                               mBrowser.exception(getInterfaceName(), "Upload object is not ready.");  
[size=1em]                       } else {  
[size=1em]                               uploadObject.clear();  
[size=1em]                               uploadObject.selectedFiles.add(mediaFile);  
[size=1em]                               uploadObject.upload(action, name);  
[size=1em]                       }  
[size=1em]               }  
[size=1em]       }  
[size=1em]  
[size=1em]}




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

快速回复 返回顶部 返回列表