Android应用中实现背景音乐循环播放及音量锁定功能
在Android开发中,可以通过系统API控制设备的音量并实现音频的持续播放。以下示例展示了如何通过代码设定特定音频流的音量,并阻止用户手动调节音量或退出应用程序。
音量控制方法说明
使用 AudioManager 类可以对不同类型的音频流进行操作:
setStreamVolume(int streamType, int index, int flags)
- streamType: 指定需要修改的音频流类型,常见取值包括:
STREAM_ALARM:闹钟提示音STREAM_MUSIC:媒体播放音量STREAM_NOTIFICATION:通知声音STREAM_RING:来电铃声STREAM_SYSTEM:系统提示音STREAM_VOICE_CALL:通话音量
- index: 设置目标音量级别
- flags: 控制行为的标志位,例如:
FLAG_PLAY_SOUND:调整时播放提示音FLAG_SHOW_UI:显示系统默认的音量条
核心实现逻辑
下面是一个完整的Activity示例,在其中实现了网页加载、背景音乐循环播放以及强制锁定音量的功能。
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends AppCompatActivity {
private WebView webView;
private Timer taskScheduler = new Timer();
private AudioManager audioController;
private MediaPlayer backgroundMusic;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = findViewById(R.id.webView1);
setupWebView();
audioController = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
backgroundMusic = MediaPlayer.create(this, R.raw.background_track);
startBackgroundPlayback();
monitorHeadsetEvents();
}
private void setupWebView() {
webView.setWebViewClient(new WebViewClient());
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setUseWideViewPort(true);
settings.setLoadWithOverviewMode(true);
webView.loadUrl("https://www.example.com");
}
private void startBackgroundPlayback() {
TimerTask playbackTask = new TimerTask() {
@Override
public void run() {
if (!backgroundMusic.isPlaying()) {
backgroundMusic.start();
}
// 锁定媒体音量为最大值
audioController.setStreamVolume(
AudioManager.STREAM_MUSIC,
audioController.getStreamMaxVolume(AudioManager.STREAM_MUSIC),
0
);
audioController.setMicrophoneMute(false);
audioController.setSpeakerphoneOn(true);
setVolumeControlStream(AudioManager.STREAM_MUSIC);
}
};
taskScheduler.scheduleAtFixedRate(playbackTask, 0, 50);
}
private void monitorHeadsetEvents() {
IntentFilter filter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
registerReceiver(new HeadsetPlugReceiver(), filter);
}
@Override
public void onBackPressed() {
Toast.makeText(this, "当前无法退出应用", Toast.LENGTH_SHORT).show();
}
static class HeadsetPlugReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (Intent.ACTION_HEADSET_PLUG.equals(action)) {
boolean isConnected = intent.getIntExtra("state", 0) == 1;
String message = isConnected ? "检测到耳机连接" : "耳机断开连接";
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
}
}
}
}
该实现利用定时任务不断检查音乐播放状态,并将媒体音量固定设为最高。同时注册了耳机插拔事件的广播接收器以增强用户体验。