【Android 多媒体应用】使用MediaRecoder录制,MediaPlayer播放音频数据
1.MainActivity.java
import android.annotation.TargetApi;
import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast; import java.io.File;
import java.io.IOException; public class MainActivity extends Activity implements View.OnClickListener {
private final static String TAG = "debug--";
private Button btnRecord,btnStop,btnPlay;
private File soundFile;
private MediaRecorder mRecoder;
private MediaPlayer mPlayer;
private TextView mTxt ;
private Handler handler = new Handler(){
public void handleMessage(Message msg) {
Log.d(TAG, Integer.toString(msg.what));
mTxt.setText(msg.what/60+":"+msg.what%60);
super.handleMessage(msg);
}
}; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); btnRecord = (Button)findViewById(R.id.start);
btnStop = (Button)findViewById(R.id.stop);
btnPlay = (Button)findViewById(R.id.play);
mTxt = (TextView)findViewById(R.id.txtTime);
btnRecord.setOnClickListener(this);
btnStop.setOnClickListener(this);
btnPlay.setOnClickListener(this);
} public void onDestroy() { super.onDestroy();
if((mRecoder != null) && (soundFile !=null) && (soundFile.exists())) {
mRecoder.stop();
mRecoder.release();
mRecoder = null;
} } @Override
public void onClick(View v)
{
switch(v.getId())
{
case R.id.start:
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
{
Toast.makeText(MainActivity.this,"check SD Card Faild!",Toast.LENGTH_SHORT).show();
return;
} try {
soundFile = new File("sdcard/sound.amr");
mRecoder = new MediaRecorder();
mRecoder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecoder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
mRecoder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecoder.setOutputFile(soundFile.getAbsolutePath());
mRecoder.prepare();
mRecoder.start();
showRecordTime();
Log.d(TAG, "start");
Toast.makeText(MainActivity.this,"start Recording!",Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
break;
case R.id.stop:
if(soundFile != null && soundFile.exists())
{
mRecoder.stop();
mRecoder.release();
mRecoder = null;
Log.d(TAG, "stop");
Toast.makeText(MainActivity.this,"Stop Recording!",Toast.LENGTH_SHORT).show();
}
break;
case R.id.play:
{
Log.d(TAG,btnPlay.getText().toString());
if (btnPlay.getText().toString().equalsIgnoreCase("Play") ) {
Log.d(TAG,"play@@@@@@@");
mPlayer = new MediaPlayer();
try {
mPlayer.setDataSource("sdcard/sound.amr");
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mPlayer.prepare();
mPlayer.start();
btnPlay.setText("Stop");
} catch (IOException e) {
e.printStackTrace();
}
}else if (btnPlay.getText().toString().equalsIgnoreCase("Stop") )
{
if(mPlayer != null)
{
mPlayer.stop();
mPlayer.release();
btnPlay.setText("Play");
}
}
}
break;
} } private void showRecordTime() { new Thread(new Runnable() {
@Override
public void run() {
int time_sec = 0;
while(mRecoder != null)
{
try {
Thread.sleep(1000);
Message message = new Message();
time_sec +=1;
message.what = time_sec ;
handler.sendMessage(message);
} catch (InterruptedException e) {
e.printStackTrace();
}
} }
}).start(); }
}
2.activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:weightSum="1"> <TextView
android:layout_width="match_parent"
android:layout_height="100dp"
android:gravity="center"
android:textSize="40dip"
android:textColor="#000000"
android:id="@+id/txtTime"/>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="1dp">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:id="@+id/start"
android:text="start"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:id="@+id/stop"
android:text="stop"/>
</LinearLayout> <Button
android:text="play"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/play" /> </LinearLayout>
3.AndroidMainfest.xml添加权限
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
【Android 多媒体应用】使用MediaRecoder录制,MediaPlayer播放音频数据的更多相关文章
- Android学习总结(十六) ———— MediaPlayer播放音频与视频
一.基本概念 本文主要介绍的是Android中很重要也最为复杂的媒体播放器(MediaPlayer)部分的架构.Android的MediaPlayer包含了Audio和video的播放功能,在Andr ...
- Android MediaPlayer 播放音频
本文链接: Android MediaPlayer 播放音频 主要介绍使用MediaPlayer播放音频的方式.关于MediaPlayer的基础知识,比如状态,可以参考Android MediaPla ...
- MediaPlayer播放音频,也可以播放视频
使用MediaPlayer播放音频或者视频的最简单例子: JAVA代码部分: public class MediaPlayerStudy extends Activity { private Butt ...
- (原)关于OpenSL ES播放音频数据的一个奇怪的问题
关于OpenSL ES播放音频数据的一个奇怪的问题 Author:lihaiping1603@aliyun.com 最近用业余时间做了一个android平台的播放器sdk,其中视频用的opengl e ...
- Android 视频播放器 (二):使用MediaPlayer播放视频
在 Android 视频播放器 (一):使用VideoView播放视频 我们讲了一下如何使用VideoView播放视频,了解了基本的播放器的一些知识和内容.也知道VideoView内部封装的就是Med ...
- 【我的Android进阶之旅】解决MediaPlayer播放音乐的时候报错: Should have subtitle controller already set
一错误描述 二错误解决 解决方法一 解决方法二 一.错误描述 刚用MediaPlayer播放Music的时候,看到Log打印台总是会打印一条错误日志,MediaPlayer: Should have ...
- 使用MediaPlayer播放音频-----之二
MediaPlayer播放不同来源的音频文件: 一.播放应用的资源文件 1.调用MediaPlayer的create(Context context , int resid)方法加载指定资源文件. ...
- 使用MediaPlayer播放音频-----之一
MediaPlayer提供了如下方法来指定装载相应的音频文件: 1.void setDataSource( String path):指定装载path路径所代表的文件. 2.void setDa ...
- AudioManager: android插上耳机仍然使用扬声器播放音频
手机音频的输出有外放(Speaker).听筒(Telephone Receiver).有线耳机(WiredHeadset).蓝牙音箱(Bluetooth A2DP)等输出设备.在平时,电话免提.插拔耳 ...
随机推荐
- hdu 1695 GCD 莫比乌斯
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- 通过YUM命令查找对应命令是通过何种软件提供的
# yum whatprovides [命令]
- Springboot- Caused by: org.hibernate.AnnotationException: No identifier specified for entity:
错误与异常: Caused by: org.hibernate.AnnotationException: No identifier specified for entity: 原因:引用了不对的包, ...
- 解决Chrome Safari Opera环境下 动态创建iframe onload事件同步执行
我们先看下面的代码: setTimeout(function(){ alert(count); },2000); var count = []; document.body.appendChild(c ...
- ural 2017 Best of a bad lot
2017. Best of a bad lot Time limit: 1.0 secondMemory limit: 64 MB A cruise liner hasn’t moved away f ...
- Maven下载 || 配置本地仓库 || IntelliJ IDEA配置Maven教程
本文章主要介绍1.Maven下载 2.配置本地仓库Repository 3.IDEA配置Maven 三点. 相关博客: Eclipse配置Maven https://www.cnblogs.c ...
- Shell编程-运算符
1.declare命令 declare声明变量类型:declare [+/-][选项] 变量名 -:给变量设定类型属性 +:取消变量的类型属性 -a:将变量声明为数组型 -i:整数型 -x:环境变量 ...
- PHP文件管理
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Express+Mongoose(MongoDB)+Vue2全栈微信商城项目全记录(一)
最近用vue2做了一个微信商城项目,因为做的比较仓促,所以一边写一下整个流程,一边稍做优化. 项目github地址:https://github.com/seven9115/vue-fullstack ...
- mapreduce-实现单表关联
//map类 package hadoop3; import java.io.IOException; import org.apache.hadoop.io.LongWritable;import ...