【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)等输出设备.在平时,电话免提.插拔耳 ...
随机推荐
- JMeter-Window10系统下设置环境变量
首先我们右击此电脑(我的电脑),点击属性 接下来我们就可以进入到控制面板主页,点击[高级系统设置] 在系统属性里面,点击[环境变量]按钮 在环境变量里面,点击[新建]按钮 接下来我们输 ...
- iphone动态下拉菜单
介绍:实现带动画效果的下拉菜单.用户按下菜单按钮,出现下拉按钮,用户松开菜单按钮,下拉按钮收回. 测试环境:Xcode 4.3, iOS 5.0. 效果图: jQuery特效:http://www.h ...
- java文件读写常用方法
// TODO Auto-generated method stub //File file = new File("D:\\Android\\workspace\\Practice1\\s ...
- Redis学习路线
[http://www.cnblogs.com/zhenjing/archive/2012/11/15/redis_research.html] Redis: A persistent key-val ...
- numpy常用函数之randn
numpy中有一些常用的用来产生随机数的函数,randn就是其中一个,randn函数位于numpy.random中,函数原型如下: numpy.random.randn(d0, d1, ..., dn ...
- let和const命令新总结
let声明变量 新特性 声明的变量仅仅在块级作用域有效 块级作用域:外层作用于无法读取内层作用于周中的变量,内层作用域可以定义外层作用于中的同名变量 不存在变量提升 暂时性死区 只要在块级作用域内存在 ...
- Multiprovide 实践理解
“多重提供器”是一种“信息提供者”,它综合了多个“信息提供者”的数据以用于报告.“多重提供者”本身不包含任何数据.“多重提供者”的数据由所基于的“信息提供者”专门提供,这些“信息提供者”组合在一起进行 ...
- 打印控件Lodop
官网:http://www.lodop.net/demo.html Lodop.C-Lodop使用说明及样例 Lodop(标音:劳道谱,俗称:露肚皮)是专业WEB控件,用它既可裁剪输出页面内容,又 ...
- python 计数器类Counter的用法
简单操作: import collections A=['a','b','b','c','d','b','a'] count=collections.Counter(A) print(count) C ...
- Cow Exhibition (背包中的负数问题)
个人心得:背包,动态规划真的是有点模糊不清,太过于抽象,为什么有些是从后面递推, 有些状态就是从前面往后面,真叫人头大. 这一题因为涉及到负数,所以网上大神们就把开始位置从10000开始,这样子就转变 ...