Android蓝牙音箱按键监听(播放、暂停、上下曲)

本文详细介绍在Android环境中使用MediaPlayer播放Raw目录下音频文件的方法,包括设置数据源、准备播放状态及监听按键事件。涵盖从Android Studio开发环境配置,到不同API级别下按键监听的实现方式,以及如何避免音频播放被其他应用拦截。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

测试机

  • 荣耀9x(Android 10)
  • 三星(Android 7)

开发环境

  • Android Studio 3.5.1
  • compileSdkVersion 30
  • buildToolsVersion “30.0.1”
  • minSdkVersion 21
  • targetSdkVersion 30

播放音乐,不先播放音乐会被别的音频播放器把广播给拦截。

下面播放Raw目录下的音频文件。

mediaPlayer = new MediaPlayer();
AssetFileDescriptor afd = getResources().openRawResourceFd(R.raw.hui);
try {
    mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
} catch (IOException e) {
    e.printStackTrace();
}
//异步准备播放
mediaPlayer.prepareAsync();
//设置准备就绪状态监听
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        // 开始播放
        mediaPlayer.start();
    }
});
按键状态监听

Api21 之前

  1. 新建按键广播监听类
/**
 * Author: jVen
 * Time: 2020/8/14 16:39
 * Description:
 */
public class MyMediaButtonReceiver extends BroadcastReceiver {
    private String TAG = "MyMediaButtonReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (action != null) {
            if (TextUtils.equals(action, Intent.ACTION_MEDIA_BUTTON)) {
                KeyEvent keyEvent = intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
                if (keyEvent != null) {
                    if (keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
                        int keyCode = keyEvent.getKeyCode();
                        switch (keyCode) {
                            //可以通过广播形式通知Activity更新UI
                            case KeyEvent.KEYCODE_MEDIA_PLAY:
                                Toast.makeText(context, "onReceive: 播放", Toast.LENGTH_SHORT).show();
                                break;
                            case KeyEvent.KEYCODE_MEDIA_PAUSE:
                                Toast.makeText(context, "onReceive: 暂停", Toast.LENGTH_SHORT).show();
                                break;
                            case KeyEvent.KEYCODE_MEDIA_NEXT:
                                Toast.makeText(context, "onReceive: 下一首", Toast.LENGTH_SHORT).show();
                                break;
                            case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
                                Toast.makeText(context, "onReceive: 上一首", Toast.LENGTH_SHORT).show();
                                break;
                        }
                    }
                }
            }
        }
    }
}
  1. AndroidManifest.xml
<receiver android:name=".MyMediaButtonReceiver">
    <intent-filter>
        <action android:name="android.intent.action.MEDIA_BUTTON" />
    </intent-filter>
</receiver>
  1. Activity注册广播
//获取音频服务
AudioManager audioManager = (AudioManager) this.getSystemService(AUDIO_SERVICE);
//注册接收的Receiver
ComponentName mRemoteControlClientReceiverComponent;
mRemoteControlClientReceiverComponent = new ComponentName(
        getPackageName(), MyMediaButtonReceiver.class.getName());
//注册MediaButton
audioManager.registerMediaButtonEventReceiver(mRemoteControlClientReceiverComponent);

registerMediaButtonEventReceiver Api21之后过时,但是两部测试机依然可以使用这个监听到蓝牙的按键事件。


Api21之后

  1. 添加依赖
implementation "androidx.media:media:1.1.0"
  1. 注册广播
ComponentName mbr = new ComponentName(getPackageName(), MediaButtonReceiver.class.getName());
mMediaSession = new MediaSessionCompat(this, "mbr", mbr, null);
//一定要设置
mMediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |
        MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
if (!mMediaSession.isActive()) {
    mMediaSession.setActive(true);
}
mMediaSession.setCallback(new MediaSessionCompat.Callback() {
    @Override
    public boolean onMediaButtonEvent(Intent intent) {
        String action = intent.getAction();
        if (action != null) {
            if (TextUtils.equals(action, Intent.ACTION_MEDIA_BUTTON)) {
                KeyEvent keyEvent = intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
                if (keyEvent != null) {
                    if (keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
                        int keyCode = keyEvent.getKeyCode();
                        switch (keyCode) {
                            //可以通过广播形式通知Activity更新UI
                            case KeyEvent.KEYCODE_MEDIA_PLAY:
                                Toast.makeText(MainActivity.this, "onReceive: 播放", Toast.LENGTH_SHORT).show();
                                break;
                            case KeyEvent.KEYCODE_MEDIA_PAUSE:
                                Toast.makeText(MainActivity.this, "onReceive: 暂停", Toast.LENGTH_SHORT).show();
                                break;
                            case KeyEvent.KEYCODE_MEDIA_NEXT:
                                Toast.makeText(MainActivity.this, "onReceive: 下一首", Toast.LENGTH_SHORT).show();
                                break;
                            case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
                                Toast.makeText(MainActivity.this, "onReceive: 上一首", Toast.LENGTH_SHORT).show();
                                break;
                        }
                    }
                }
            }
        }

        return super.onMediaButtonEvent(intent);
    }
});

一定要先播放音乐事件才不会被别的播放器拦截,最好把音频焦点也获取了(焦点获取了别的播放器的逻辑里面会暂停播放)

如果您想使用Android的AudioRecorder录制音频,并在蓝牙音箱播放,请按照以下步骤操作: 1. 配置和准备录音器 创建`AudioRecorder`对象,设置音频源、采样率、声道数、编码格式等参数,并调用`prepare()`方法准备录音器。 2. 启动录音 调用`start()`方法开始录音。录音期间,将蓝牙音箱连接到Android设备,并将其设置为音频输出源。 3. 播放录制的音频 录音完成后,您可以使用`MediaPlayer`对象加载和播放录制的音频文件。在播放期间,音频将通过蓝牙音箱进行输出。 下面是一个简单的示例代码: ``` private AudioRecorder audioRecorder; private MediaPlayer mediaPlayer; private void startRecordingAndPlayback() { audioRecorder = new AudioRecorder(); audioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); audioRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); audioRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); audioRecorder.setAudioSamplingRate(44100); audioRecorder.setAudioChannels(2); audioRecorder.setOutputFile(getFilePath()); // 设置音频文件保存路径 try { audioRecorder.prepare(); audioRecorder.start(); } catch (Exception e) { e.printStackTrace(); } mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource(getFilePath()); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.prepare(); mediaPlayer.start(); } private void stopRecordingAndPlayback() { if (mediaPlayer != null) { mediaPlayer.stop(); mediaPlayer.release(); mediaPlayer = null; } if (audioRecorder != null) { audioRecorder.stop(); audioRecorder.release(); audioRecorder = null; } } ``` 请注意,这只是一个基本示例。您可能需要根据自己的需求进行更改和优化。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值