10天学通Android开发(8)-多媒体

一、播放声音SoundPool

SoundPool播放短的音效,不能播放歌曲

可以用soundpool,用soundpool可以播一些短的反应速度要求高的声音,
比如游戏中的爆破声,而mediaplayer适合播放长点的。
SoundPool载入音乐文件使用了独立的线程,不会阻塞UI主线程的操作, SoundPool类支持同时播放多个音效,这对于游戏来说是十分必要的,而MediaPlayer类是同步执行的只能一个文件一个文件的播放。

实例:

sp=new SoundPool(1,AudioManager.STREAM_MUSIC,0);

加载:

soundId = sp.load(this, R.raw.note1, 1);

播放,可设置慢速、快速、频率高低等

sp.play(soundId, 1, 1, 0, 0, 2.0f);

二、播放声音MediaPlay

MediaPlayer可播放长的声音,可后台播放

创建:

mp= MediaPlayer.create(this,R.raw.song);

释放:

mp.release();

相关资源准备、该下载就下载

mp.prepare();

播放:

mp.start();

三、录音MediaRecord

写入外部存储的权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

录音权限:

<uses-permission android:name="android.permission.RECORD_AUDIO"/>

创建目录:

File dir=new File(Environment.getExternalStorageDirectory(),"sonunds");

if(!dir.exists())

{

dir.mkdir();//创建目录

}

创建文件:

File soundFile=new File(dir,System.currentTimeMillis()+".amr");

if(!soundFile.exists())

{

try//捕获一个异常

{

soundFile.createNewFile();

}

catch(IOException e)

{

e.printStackTrace();

}

}

指定输出

mr=new MediaRecorder();

mr.setOutputFile(soundFile.getAbsolutePath());/

准备并开始录制:

mr.prepare();

mr.start();

停止录制:

mr.stop();

案例分析:

  1. 界面,四个按钮:

<Button

android:id="@+id/btnPlaySound"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="PlaySound" />

<Button

android:id="@+id/btnPlaySong"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="PlaySong" />

<Button

android:id="@+id/btnRecordBegin"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="开始录制" />

<Button

android:id="@+id/btnRecordStop"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="停止录制" />

  1. 播放短的音效

sp=new SoundPool(1,AudioManager.STREAM_MUSIC,0);

soundId = sp.load(this, R.raw.note1, 1);

findViewById(R.id.btnPlaySound).setOnClickListener(new View.OnClickListener() {

@Override

publicvoid onClick(View v) {

sp.play(soundId, 1, 1, 0, 0,2.0f);

}

});

  1. 播放歌曲

findViewById(R.id.btnPlaySong).setOnClickListener(newView.OnClickListener() {

@Override

publicvoid onClick(View v) {

if (mp!=null) {

mp.start();

}

}

});

4)录音

findViewById(R.id.btnRecordBegin).setOnClickListener(new View.OnClickListener() {

@Override

publicvoid onClick(View v) {

startRecord();

}

privatevoid startRecord() {

if(mr==null)

{

File dir=new File(Environment.getExternalStorageDirectory(),"sonunds");

if(!dir.exists())

{

dir.mkdir();//创建目录

}

File soundFile=new File(dir,System.currentTimeMillis()+".amr");

if(!soundFile.exists())

{

try//捕获一个异常

{

soundFile.createNewFile();

}

catch(IOException e)

{

e.printStackTrace();

}

}

mr=new MediaRecorder();

mr.setAudioSource(MediaRecorder.AudioSource.MIC);//指定输入源

mr.setOutputFormat(MediaRecorder.AudioEncoder.AMR_WB);//输出编码格式

mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB);//输入编码格式

mr.setOutputFile(soundFile.getAbsolutePath());//指定输出

try {

mr.prepare();

mr.start();

} catch (IllegalStateException e) {

// TODO Auto-generatedcatch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generatedcatch block

e.printStackTrace();

}

}

}

});

5)停止录音

findViewById(R.id.btnRecordStop).setOnClickListener(new View.OnClickListener() {

@Override

publicvoid onClick(View v) {

stopRecord();

}

privatevoid stopRecord() {

if(mr!=null)

{

mr.stop();

mr.release();

mr=null;

}

}

});

6)权限设置

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<uses-permission android:name="android.permission.RECORD_AUDIO" />

源码下载:

时间: 2024-10-15 17:45:08

10天学通Android开发(8)-多媒体的相关文章

10天学通Android开发(1)-环境搭建和Hello测试

首先要搭建环境,然后创建一个简单的HelloWorld.本文的主题如下: 1.环境搭建 1.1.JDK安装 1.2 Eclipse安装 1.3 Android SDK安装 1.4.ADT安装 1.5.创建AVD  2.HelloWorld 1环境搭建 1.1.JDK安装 安装java并配置环境变量   http://www.oracle.com/---->downloads--àJava ForDevelopers--àJDK,选择Windows X86(32位)或Windows X64(64位

10天学通Android开发(4)-用户布局与常用控件

常用布局 FrameLayout:子元素没有相对位置概念,都相对于左上角 LinearLayout:线性布局,一个接一个,水平或垂直 RelativeLayout:相对布局,可相对其它子元素 TableLayout:水平和垂直LinearLayout的混和 如: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.andr

10天学通Android开发(2-3)-核心组件Service绑定

通过startService开启的服务,当访问者关闭时,服务仍然存在:访问者需要与服务进行通信,则我们需要将访问者与服务进行绑定: 如果使用Context.bindService()方法启动服务,则在服务未创建时,系统会调用服务的onCreate()方法,接着调用onBind()方法,这时就访问者与服务已经绑定了,主程序销毁时服务也会终止. 1)绑定服务时,会自动创建服务. 2)如果创建后并启动后再绑定,不会重新创建,一个Service只有一个实例 3)同时启动和绑定服务时,解除绑定服务,但不会

10天学通Android开发(3-3)-Intent使用

Intent:可以理解为:与基本组件关联的数据对象,用来指定用来启动或激活的目标组件 Android引入了Intent的概念来唤起components,component包括:1.Activity(UI元件) 2.Service(后台代码) 3.Broadcast receiver(处理广播消息的代码) 4.Content provider(抽象数据的代码) Intent(意图)主要是解决Android应用的各项组件之间的通讯. Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行

10天学通Android开发(3-1)-组件广播接收器Broadcast Receive

广播接收器,它和事件处理机制类似,只不过事件的处理机制是程序组件级别的,而广播处理机制是系统级别的. BroadcastReceiver如操作系统启动完毕,发出广播信号:低电量提示广播,应用中耗电量大的部分功能关闭:侦听短信: 用于接收并处理广播通知(broadcastannouncements).多数的广播是系统发起的,如地域变换.电量不足.来电来信等.程序也可以播放一个广播.程序可以有任意数量的 broadcast receivers来响应它觉得重要的通知.broadcast receive

10天学通Android开发(2-2)-核心组件Service创建

有些程序不需要交互,在后台运行,并可长时间运行,不被操作系统杀死,这就是组件Service 声明Service,新建class,MyService,扩展自Service AndroidManifest中配置, 在Application中添加Serivice,选择MySerivice 实际添加了一行: <serviceandroid:name="MyService"></service> 添加二个按钮,启动Service和停止Service <Button

10天学通Android开发(3-2)-组件ContentProvider

1)ContentProvider简介      该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据:采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据.而使用ContentProvider共享数据的好处是统一了数据访问方式. 2)每个ContentProvider都有一个公共的URI,这个URI用于

10天学通Android开发(2-1)-核心组件Activity

Activity.Service.Broadcast Receiver.Content Provide为Android四大核心组件,Activity是与用户交互的窗口,有三种状态:运行.暂停.停止 七个方法:    protected void onCreate(Bundle savedInstanceState);      protected void onStart();      protected void onRestart();      protected void onResu

10天学通Android开发(5)-项目实战:计算器

项目实战:实现一个简单计算器 界面设计 (1)拖进一个大文本,整屏,设计各个数字及运算,用Table来存放. <TableLayout android:layout_width="fill_parent" android:layout_height="wrap_content"> <TableRow android:id="@+id/tableRow1" android:layout_width="fill_paren