Я работаю над сервисом медиаплеера в студии Android, и я хочу, чтобы звук появлялся / затухал при запуске / остановке сервиса.
Я пробовал решение из этого потока: Android Studio Mediaplayer, как появляются и исчезают, но похоже, что код не подходит для моей службы. Музыка играет только долю секунды, а затем музыка остановилась.
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));
}
Журнал DEBUG
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