【发布时间】:2018-04-10 13:10:10
【问题描述】:
我正在 android studio 中开发媒体播放器服务,我想在服务启动/停止时淡入/淡出声音。
我已经尝试了这个线程的解决方案: Android Studio Mediaplayer how to fade in and out ,但似乎代码不适合我的服务。音乐只播放了片刻,然后音乐停止了。
BGMPlayer.java(服务)
public class BGMPlayer extends Service {
private MediaPlayer bgmusic1;
int volume = 0;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId){
bgmusic1 = MediaPlayer.create(this, R.raw.bgmusic1);
bgmusic1.setLooping(true);
bgmusic1.start();
FadeIn();
//we have some options for service
//start sticky means service will be explicity started and stopped
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
bgmusic1.stop();
}
private void FadeIn() {
final int FADE_DURATION = 3000; //The duration of the fade
//The amount of time between volume changes. The smaller this is, the smoother the fade
final int FADE_INTERVAL = 250;
final int MAX_VOLUME = 1; //The volume will increase from 0 to 1
int numberOfSteps = FADE_DURATION / FADE_INTERVAL; //Calculate the number of fade steps
//Calculate by how much the volume changes each step
final float deltaVolume = MAX_VOLUME / (float) numberOfSteps;
//Create a new Timer and Timer task to run the fading outside the main UI thread
final Timer timer = new Timer(true);
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
fadeInStep(deltaVolume); //Do a fade step
Log.d("DEBUG","MUSIC VOLUME IS NOW " + volume);
//Cancel and Purge the Timer if the desired volume has been reached
if (volume >= 1f) {
Log.d("DEBUG","MUSIC VOLUME REACHED 1");
timer.cancel();
timer.purge();
}
}
};
timer.schedule(timerTask, FADE_INTERVAL, FADE_INTERVAL);
}
private void fadeInStep(float deltaVolume) {
bgmusic1.setVolume(volume, volume);
volume += deltaVolume;
}
}
Activity.java
@Override
protected void onStart() {
super.onStart();
//music start
startService(new Intent(this, BGMPlayer.class));
Log.d("DEBUG","LoadingScreenStart");
}
@Override
protected void onStop() {
super.onStop();
//Stop the music
stopService(new Intent(this, BGMPlayer.class));
}
调试日志
04-10 21:15:29.325 6147-6147/com.example.max.curerthegame D/DEBUG: LoadingScreenStart
04-10 21:15:29.643 6147-6183/com.example.max.curerthegame D/DEBUG: MUSIC VOLUME IS NOW 0
04-10 21:15:29.893 6147-6183/com.example.max.curerthegame D/DEBUG: MUSIC VOLUME IS NOW 0
04-10 21:15:32.159 6147-6183/com.example.max.curerthegame D/DEBUG: MUSIC VOLUME IS NOW 0
04-10 21:15:32.410 6147-6183/com.example.max.curerthegame D/DEBUG: MUSIC VOLUME IS NOW 0
04-10 21:15:32.660 6147-6183/com.example.max.curerthegame D/DEBUG: MUSIC VOLUME IS NOW 0
04-10 21:15:34.672 6147-6183/com.example.max.curerthegame D/DEBUG: MUSIC VOLUME IS NOW 0
04-10 21:15:34.927 6147-6183/com.example.max.curerthegame D/DEBUG: MUSIC VOLUME IS NOW 0
04-10 21:15:49.765 6147-6183/com.example.max.curerthegame D/DEBUG: MUSIC VOLUME IS NOW 0
【问题讨论】:
标签: java android audio media-player fade