android上播放按键声音方法

在自定义控件时,有时候需要针对用户的操作播放一些声音,一般这些声音格式都是ogg/mp3等格式,目前发现有三种方法来进行播放。

1. 使用playSoundEffect函数进行播放系统内置声音,比如:

?
playSoundEffect(SoundEffectConstants.NAVIGATION_LEFT); //播放向左导航声音

2. 使用AudioManager进行播放系统内置声音,比如:

?
AudioManager mAudioMgr = (AudioManager) context.getSystemService(mContext.AUDIO_SERVICE);
mAudioMgr.playSoundEffect(AudioManager.FX_FOCUS_NAVIGATION_LEFT);

3. 使用SoundPool播放制定的声音文件,比如:

// 第一个参数为同时播放数据流的最大个数,第二数据流类型,第三为声音质量
SoundPool sp = newSoundPool(10, AudioManager.STREAM_SYSTEM, 5);
intmusic = sp.load(context, R.raw.key_tick, 1);
sp.play(music,1,1,0,0,1);

当然,我们也可以用MediaPlayer进行声音的播放,但是用这个仅仅播放一个按键声音感觉就有点笨重了。

### 实现按键触发播放音乐功能 在 Android 应用中实现按键触发播放音乐的功能主要涉及 `MEDIA_BUTTON` Intent 和音频焦点管理。当媒体按钮被按下时,系统会广播一个带有动作 `android.intent.action.MEDIA_BUTTON` 的意图,并附带具体的键事件。 为了处理这些按键事件并相应地控制音乐播放,在应用程序中需要注册一个广播接收器来监听此类意图: #### 注册广播接收器 创建一个新的类继承自 `BroadcastReceiver` 并重写其 `onReceive()` 方法以响应来自系统的 `MEDIA_BUTTON` 意图[^2]。 ```java public class MediaButtonIntentReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (Intent.ACTION_MEDIA_BUTTON.equals(action)) { KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); if (event != null && event.getAction() == KeyEvent.ACTION_DOWN){ // 处理不同的按键操作 switch(event.getKeyCode()){ case KeyEvent.KEYCODE_HEADSETHOOK: togglePlayPause(); break; default: Log.d("MediaButton", "Unhandled key code:" + event.getKeyCode()); } } } } private void togglePlayPause(){ // 切换播放暂停逻辑 } } ``` #### 请求音频焦点 每当准备开始或停止播放音频之前,应该请求获得音频焦点。这可以通过调用 `AudioManager.requestAudioFocus()` 来完成。如果成功获得了焦点,则可以继续执行播放;否则应等待直到再次获取到焦点为止[^4]。 ```java AudioManager am = (AudioManager)getSystemService(AUDIO_SERVICE); // Request audio focus for playback int result = am.requestAudioFocus(afChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { // Start playback. } else { // Do something else or wait until you get the focus back. } // Audio Focus change listener OnAudioFocusChangeListener afChangeListener = new OnAudioFocusChangeListener() { public void onAudioFocusChange(int focusChange) { if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT || focusChange == AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) { // Pause playback } else if (focusChange == AUDIOFOCUS_GAIN) { // Resume playback } else if (focusChange == AUDIOFOCUS_LOSS) { // Stop playback and release resources } } }; ``` 通过上述方法可以在用户按下调音台上的硬件按钮或其他形式的输入设备时有效地启动或暂停正在运行的应用程序内的音乐流[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值