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][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]} |
欢迎光临 中科因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/) | Powered by Discuz! X3.4 |