Android实现即时音效和背景音乐(整理自用)

1、播放背景音乐
    Activity page1;
    private static MediaPlayer mp = null; // 声明 MediaPlayer引用
mp = new MediaPlayer();
try {
AssetFileDescriptor fileDescriptor = page1.getAssets().openFd(
media_mp3);// assets与 res 平级
mp.setDataSource(fileDescriptor.getFileDescriptor(),
fileDescriptor.getStartOffset(),
fileDescriptor.getLength());
mp.prepare();
} catch (Exception e) {
MyDialog e_msg = MyDialog.newInstance("错误", "录音加载错误!\r\n" + e);
e_msg.show(page1.getFragmentManager(), "");
}
mp.start();
mp.setOnCompletionListener(new OnCompletionListener() {// 播放完毕监听事件
@Override
public void onCompletion(MediaPlayer mp1) {
btn2.setText("播放");
mp.stop();
mp.release();
mp = null;
}
});


2、播放即时音乐


    SoundPool sp;  // soundpool对象
HashMap hm;  // 存放声音文件
int currStreamId;  // 当前播放音频文件ID
// 初始化声音池
@SuppressLint("UseSparseArrays") @SuppressWarnings("deprecation")
private void initSoundPool() {
// 创建 SoundPool 对象
sp = new SoundPool(4, AudioManager.STREAM_MUSIC, 0);
hm = new HashMap();
// 加载声音文件 并且设置为 ID=1(1号声音)放入 hm 中
hm.put(1, sp.load(this, R.raw.backroad, 1));// raw 位于 res 目录下
}


// 播放声音
protected void playSound(int sound, int loop) {// sound 声音 ID=1,loop 0不循环,1循环
    // 获取 AudioManager 引用
    AudioManager am = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
    // 获取当前音量
    float streamVolumeCurrent = am
    .getStreamVolume(AudioManager.STREAM_MUSIC);
    // 获取系统最大音量
    float streamVolumeMax = am
    .getStreamMaxVolume(AudioManager.STREAM_MUSIC);

    // 计算播放音量
    float volume = streamVolumeCurrent / streamVolumeMax;
   
    // 调用 SoundPool 的 play 方法播放声音文件
    currStreamId = sp.play(hm.get(sound), volume, volume, 1, loop, 1.0f);
}

sp.stop(currStreamId);



2) 如何设置要播放的文件:
MediaPlayer要播放的文件主要包括3个来源:
a. 用户在应用中事先自带的resource资源
例如:MediaPlayer.create(this, R.raw.test);
b. 存储在SD卡或其他文件路径下的媒体文件
例如:mp.setDataSource("/sdcard/test.mp3");
c. 网络上的媒体文件
例如:mp.setDataSource("http://www.citynorth.cn/music/confucius.mp3");


MediaPlayer的setDataSource一共四个方法:
setDataSource (String path) 
setDataSource (FileDescriptor fd) 
setDataSource (Context context, Uri uri) 
setDataSource (FileDescriptor fd, long offset, long length)
 
其中使用FileDescriptor时,需要将文件放到与res文件夹平级的assets文件夹里,然后使用:
AssetFileDescriptor fileDescriptor = getAssets().openFd("rain.mp3");
m_mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(), fileDescriptor.getLength());
来设置datasource


你可能感兴趣的:(Android)