- Android 系统概述
- 什么是智能手机?智能手机操作系统有哪些?
- Android(安卓)是什么?
- Android 系统架构(图解)
- Android 7 新特性介绍
- Android 开发环境搭建
- Android 开发环境搭建教程(图解)
- Android SDK 是什么?
- 通过 Android Studio 创建 Android 应用程序(附带解析)
- Android Studio 的基本调试
- Android 应用程序结构:Android 组件和资源详解
- Android 四大核心组件:Activity+Service+BroadcastReceiver+ContentProvider
- Android Activity 组件及其生命周期
- Android 资源(res 和 assets 目录)
- AndroidManifest.xml 配置文件详解
- Android App Widgets 组件详解
- Android 系统的进程和线程
- Android GUI(图形用户界面)开发
- Android View 和 ViewGroup
- Android 使用 XML 文件定义用户界面
- Android 五大布局:FrameLayout、LinearLayout、AbsoluteLayout、RelativeLayout 和 TableLayout
- Android 创建 Widget 组件实例详解
- Android Button:按钮控件
- Android CheckBox:多选按钮控件
- Android RadioGroup:单选按钮控件
- Android TextView:文本框控件
- Android EditText:编辑框控件
- Android Spinner:下拉列表控件
- Android AutoCompleteTextView:自动完成文本框控件
- Android DatePicker 和 TimePicker:时间日期选择器
- Android ProgressBar:进度条控件
- Android ScrollView:滚动视图
- Android SeekBar:拖动条控件
- Android RatingBar:评价条控件
- Android ImageView 和 ImageButton:图片视图和图片按钮
- Android ImageSwitcher 和 Gallery:图片切换器和图库
- Android GridView:网格视图
- Android Tab:面板标签控件
- Android 菜单:选项菜单+上下文菜单+子菜单
- Android Bitmap(点阵图像、绘制图像)
- Android 对话框(AlertDialog+ProgressDialog)
- Android 多窗口模式(分屏模式)
- Android 事件监听器和回调方法
- Android 电话短信拍照开发教程
- Android Intent:不同应用程序之间通信的桥梁
- Android 实现拨打电话功能
- Android 实现接收短信和发送短信功能
- Android 调用相机进行拍照
- Android 多媒体开发
- Android Service 生命周期和使用方法
- Android BroadcastReceiver:接收广播
- Android 音频以及音频播放器开发实例
- Android MediaRecorder 录制音频
- Android 视频以及视频播放器实例
- Android Camera 相机以及相机程序开发实例
- Android MediaRecorder 录制视频
- Android 数据存储(SQLite 数据库、Android App 数据备份和恢复 )
- Android 数据存储之 SharedPreferences
- Android 数据存储之文件存储
- Android 使用 SQLite 数据库存数数据
- Android SQLite 数据库操作实例
- Android ContentProvider(内容提供者)
- Android 使用系统提供的 ContentProvider
- Android 自定义 ContentProvider
- Android 使用自定义 ContentProvider
- Google App Engine 是什么?
- Android APP 数据备份与恢复
- Android BackupAgent 实现数据备份与恢复
- Android BackupAgentHelper 实现数据备份与恢复
- Android 网络编程
- 借助 GPE 让 Android APP 和 Google App Engine 通信
- Android HTTP 通信
- Android HttpURLConnection 访问互联网资源
- Android 通过 GET 方式获取互联网资源
- Android 通过 POST 方式获取互联网资源
- Android Socket 编程(附带实例)
- Bluetooth(蓝牙)是什么?
- Android 蓝牙通信开发教程(详解版)
- Android 蓝牙通信开发实例演示
- WIFI(无线局域网)是什么?
- Android WiFi 开发(WiFi 编程)实例演示
- WIFI Direct(WIFI 直连)是什么?
- Android WIFI Direct 开发教程
- Android WIFI Direct 开发实例演示
- NFC(近场通信)是什么?
- Android NFC 开发教程
- Android USB 开发简介
- Android USB 附件模式开发教程
- Android USB 主机模式开发教程
- Android SIP 开发教程
- Android 智能传感器
- LBS(位置服务)和 GPS(全球定位系统)简介
- Android LBS 位置服务开发简介
- Android GPS 定位开发教程
- Google Map API 开发简介
- Android Google Map API Key 详细申请步骤
- Google Map API 开发 Android 地图应用实例
- Android 传感器开发教程
- Android 运动传感器开发教程
- Android 位置传感器开发教程
- Android 环境传感器开发教程
- Android 绘图(2D 绘图、3D 绘图)
- Android 2D 绘图开发简介
- Android 使用自定义 View 绘图
- Android 使用 Bitmap 绘图
- Android 使用 SurfaceView 绘制静态图像
- Android 使用 SurfaceView 绘制动态图像
- Android Drawable 开发简介
- Android 3D 绘图开发简介
- Android 硬件加速开发简介
- Android RenderScript 开发简介
- Android App 的国际化和本地化
- Android 国际化和本地化开发简介
- Android 手机区域设置详细步骤
- Android 未本地化应用开发教程
- Android 本地化应用开发教程
- Android 文本输入与复制粘贴
- Android 剪贴板框架开发简介
- Android 剪贴板数据转文本开发简介
- Android 复制粘贴开发教程
- Android Content Provider 复制复杂数据开发教程
- Android 一键复制粘贴开发实例
- Android 企业级应用开发
- Android 设备管理 API 概述
- Android 开发设备管理 API 应用教程
- Android 文本语音 API 开发教程
- Android TV 应用开发教程
- Android TV 应用开发实例
- Android 可穿戴设备应用开发教程
- Android 应用程序的发布
- Android 应用程序发布的步骤
- Android 为什么要为应用程序签名?
- Android 导出未签名应用程序开发步骤
- Android 生成签名文件开发教程
- Android 应用程序签名开发教程
- zipalign 工具优化应用程序开发简介
- Google Play Store( Android Market)发布简介
Android MediaRecorder 录制音频
Android SDK 提供了使用 MediaRecorder 类实现对音频和视频进行录制的功能。MediaRecorder 对象在运行过程中存在多种状态,其状态转化如图 1 所示。
图 1 MediaRecorder 对象状态转化图 从图 1 中可以看到:
1)创建 MediaRecorder 对象后处于 Initial 状态。
MediaRecorder 对象会占用硬件资源,因此不再需要时,应该调用 release() 方法销毁。在其他状态调用 reset() 方法,可以使得 MediaRecorder 对象重新回到 Initial 状态,达到复用 MediaRecorder 对象的目的。
2)在 Initial 状态调用 setVideoSource() 或者 setAudioSource() 之后,MediaRecorder 将进入 Initialized 状态。
对于音频录制,目前 OPhone 平台支持从麦克风或者电话两个音频源录制数据。在 Initialized 状态的 MediaRecorder 还需要设置编码格式、文件数据路径、文件格式等信息,设置之后 MediaRecorder 进入 DataSourceConfigured 状态。
3)在 DataSourceConfigured 状态调用 prepare() 方法,MediaRecorder 对象将进入 Prepared 状态,录制前的状态准备就绪。
4)在 Prepared 状态调用 start() 方法,MediaRecorder 进入 Recording 状态,声音录制可能只需一段时间,这时 MediaRecorder 一直处于录制状态。
5)在 Recording 状态调用 stop() 方法,MediaRecorder 将停止录制,并将录制内容输出到指定文件。
MediaRecorder 定义了两个内部接口 OnErrorListener 和 OnInfoListener 来监听录制过程中的错误信息。
例如,当录制的时间长度达到了最大限制或者录制文件的大小达到了最大文件限制时,系统会回调已经注册的 OnInfoListener 接口的 onInfo() 方法。
使用 MediaRecorder 类进行音频录制的基本步骤如下:
1)建立 MediaRecorder 类的对象。
MediaRecorder recorder=new MediaRecorder();
2)设置音频来源。
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
3)设置音频输出格式。
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
4)设置音频编码方式。
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
5) 设置音频文件的保存位置及文件名。
recorder.setOutputFile(PATH_NAME);
6)将录音器置于准备状态。
recorder.prepare();
7)启动录音器。
recorder.start();
8)音频录制。
9)音频录制完成,停止录音器。
recorder.stop();
10)释放录音器对象。
recorder.release();
实例 AudioRecord 演示了使用 MediaRecorder 类对音频进行录制的过程,运行效果如图 2 所示。
图 2 AudioRecord 的运行效果
该运行效果对应的布局文件 main.xml 的代码如下:
<?xml version="l.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="70dp" android:layout_marginTop="30dp" android:text="@string/hello" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:orientation="horizontal"> <ImageButton android:id="@+id/st" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:scaleType="fitXY" android:src="0drawable/st" /> <ImageButton android:id="@+id/stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="30dp" android:scaleType="fitXY" android:src="0drawable/stop" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="21dp" android:text="@string/start" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="43dp" android:text="@string/stop" /> <TextView android:id="@+id/sttext" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout>
实例 AudioRecord 中 AndroidManifest.xml 文件的代码如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="introduction.android.audiorecord" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="14" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
其中:
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
表明进行音频录制的用户权限。
实例 AudioRecord 中 MainActivity.java 的代码如下:
package introduction.android.audiorecord; import java.io.File; import java.io.IOException; import android.app.Activity; import android.media.MediaRecorder; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageButton; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity implements OnClickListener { /** * Called when the activity is first created. */ private ImageButton st, stop; private TextView sttext; private MediaRecorder mRecorder; private File recordPath; private File recordFile; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); st = (ImageButton) findViewById(R.id.st); stop = (ImageButton) findViewById(R.id.stop); sttext = (TextView) findViewById(R.id.sttext); st.setOnClickListener(this); stop.setOnClickListener(this); } public void start() { if (checkSDCard()) { recordPath = Environment.getExternalStorageDirectory(); File path = new File(recordPath.getPath() + File.separator + "audioRecords"); if (!path.mkdirs()) { Log.d("audioRecorder", "创建目录失败"); return; } } else { Toast.makeText(MainActivity.this, "SDcard 未连接", Toast.LENGTH_LONG).show(); return; } try { recordFile = File.createTempFile(String.valueOf("myrecord_"), ".amr", recordPath); } catch (IOException e) { Log.d("audioRecorder", "文件创建失败"); } mRecorder = new MediaRecorder(); //设置麦克风 mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); //输入文件格式 mRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); //音频文件编码 mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); //输出文件路径 mRecorder.setOutputFile(recordFile.getAbsolutePath()); //开始录音 try { mRecorder.prepare(); mRecorder.start(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void stop() { try { if (mRecorder != null) { mRecorder.stop(); mRecorder.release(); mRecorder = null; } } catch (IllegalStateException e) { } } private boolean checkSDCard() { // TODO Auto-generated method stub //检测 SD 卡是否插入手机中 if (android.os.Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { return true; } return false; } @Override public void onClick(View v) { // TODO Auto-generated method stub if (v == st) { MainActivity.this.start(); sttext.setText("正在录音。。。。"); if (v == stop) { sttext.setText("停止录音。。。。"); MainActivity.this.stop(); } } } }
该应用程序运行后,首先检测 SD 卡是否插入手机中。若 SD 卡在手机中,则会在 SD 卡的 audioRecords 目录下创建以“myRecord_”为前缀、以“.amr”为后缀的临时文件,并将录音内容写入该文件中。
后台录制音频
结合 Android 系统提供的相关 API,借助于 MediaRecorder 类,可以实现一些比较有意思的功能。比如,在手机中监听短信的功能,当有符合特定要求的短信到来时,启动相应服务在后台进行录音,进而将手机变化为一个可远程控制的录音机。
接下来我们在此处不去实现短信内容验证功能,而只演示通过短信远程启动后台服务并进行录音的功能,我们可以举一反三。
实例 AudioRecordService 演示了该功能。该实例实现了 BroadcastReceiver 类的子类,对手机短信息进行监听。当有短信来时,该 BroadcastReceiver 开始在后台录音并将录音文件保存在 SD 卡中,同时启动一个线程进行计时,当录音进行一分钟后,关闭录音程序。
实例 AudioRecordService 中 MessageReceiver.java 的代码如下:
package introduction.android.audiorecord; import java.io.File; import java.io.IOException; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.media.MediaRecorder; import android.os.Bundle; import android.os.Environment; import android.util.Log; public class MessageReceiver extends BroadcastReceiver { private File recordPath; private File recordFile; private MediaRecorder mRecorder; private long startTime; @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub if (intent.getAction().equals("android.proider.Telephony.SMS_RECEIVER")) { recordBegin(); new Thread(timing).start(); } } private Runnable timing = new Runnable() { private long currentTime = System.currentTimeMillis(); @Override public void run() { // TODO Auto-generated method stub while (currentTime < startTime + 60 * 1000) { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } recordStop(); } } }; private void recordBegin() { // TODO Auto-generated method stub startTime = System.currentTimeMillis(); recordPath = Environment.getExternalStorageDirectory(); File path = new File(recordPath.getPath() + File.separator + "audioRecords"); recordPath = path; try { recordFile = File.createTempFile(String.valueOf("myrecord_"), ".amr", recordPath); } catch (IOException e) { Log.d("audioRecorder", "文件创建失败"); } mRecorder = new MediaRecorder(); mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); mRecorder.setOutputFile(recordFile.getAbsolutePath()); try { mRecorder.prepare(); mRecorder.start(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } protected void recordStop() { // TODO Auto-generated method stub mRecorder.stop(); mRecorder.release(); mRecorder = null; } }
由于实例 AudioRecordService 涉及接收短信和使用录音功能,因此需要在 AndroidManifest. xml 文件中声明相应的用户权限。
AndroidManifest.xml 文件的代码如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="introduction.android.audiorecord" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="14" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-permission android:name="android.perssion.RECEIVE_SMS" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> </manifest>
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论