如何淡入淡出MediaPlayer服务中的音乐

时间:2018-04-10 13:10:11

标签: java android audio media-player fade

我正在安装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));
    }

DEBUG Log

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

1 个答案:

答案 0 :(得分:0)

您可以使用Runnable在给定的时间间隔后反复降低音量。

在编写函数后调用该函数:musicVolumeF(0.2f);

@implementation UITextView (Extension)

- (instancetype)dataDetector :(UIDataDetectorTypes)types {
    self.dataDetectorTypes = types;
    if (types != UIDataDetectorTypeNone) self.selectable = true;
    return self;
}

@end