Android-медиаплеер с восходящим звуком

У меня есть служба медиаплеера, которая воспроизводит звук и работает нормально, но я хочу увеличивать громкость рингтона каждые 5 секунд, начиная с более низкого звука. Как мне это сделать? Я читал, что лучше использовать громкость медиаплеера вместо аудиоменеджера, потому что он меняет громкость системы.

Моя служба

public class AlertSound extends Service {

    MediaPlayer mp;
    String TAG = "DebugMsg";

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        //Log.d(TAG, "onStartCommand AlertSound");
        if(intent.hasExtra("alertType")){
            startSound(intent.getStringExtra("alertType"));
        }
        else{
            startSound("warning");
        }

        return START_NOT_STICKY;
    }

    private void startSound(String alarm) {

        if(mp==null) {
            if(alarm.equals("danger")){
                mp = MediaPlayer.create(getApplicationContext(), R.raw.danger_alarm);
            }
            if(alarm.equals("warning")){
                mp = MediaPlayer.create(getApplicationContext(), R.raw.warning_alarm);
            }

            mp.start();
            mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mediaPlayer) {
                    mp.start();
                }
            });


        }
    }


    @Override
    public void onDestroy() {
        //Log.d(TAG, "StopService AlertSound");
        mp.stop();// Stop it
        mp.release();// Release it
        super.onDestroy();
    }
}

Используйте запускаемую задачу для запуска каждые 5 секунд. и оттуда вызвать громкость аудио менеджера. Пожалуйста, посмотрите stackoverflow.com/questions/14065997/…

Malik Umar 11.04.2018 12:32
0
1
55
1

Ответы 1

Хорошо, я решил и отлично работает! Я использовал h.removeCallbacksAndMessages(null) вместо h.removeCallbacks(runnable), потому что обработчик генерировал ошибку при остановке службы.

мой код

public class AlertSound extends Service {

MediaPlayer mp;
String TAG = "DebugMsg";
Handler h = new Handler();
int delay = 7*1000; //1 second=1000 milisecond
float volume=0.20f;
float increment = 0.25f;
Runnable runnable;


@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    //Log.d(TAG, "onStartCommand AlertSound");
    if(intent.hasExtra("alertType")){
        startSound(intent.getStringExtra("alertType"));
    }
    else{
        startSound("warning");
    }

    return START_NOT_STICKY;
}

private void startSound(String alarm) {

    if(mp==null) {
        if(alarm.equals("danger")){
            mp = MediaPlayer.create(getApplicationContext(), R.raw.danger_alarm);
            mp.setVolume(volume,volume);
            h.postDelayed(new Runnable() {
                public void run() {

                    runnable = this;

                    if(mp!=null) {
                        volume += increment;
                        if (volume <= 1.0f) {
                            mp.setVolume(volume, volume);
                            Log.d(TAG, "Increase Volume");
                            h.postDelayed(runnable, delay);
                        }
                        else{
                            stopHandler();
                        }
                    }
                }
            }, delay);
        }
        if(alarm.equals("warning")){
            mp.reset();
            mp = MediaPlayer.create(getApplicationContext(), R.raw.warning_alarm);
            mp.setVolume(volume,volume);
        }
        mp.start();
        mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mediaPlayer) {
                mp.start();
                mp.setVolume(volume, volume);
            }
        });


    }
}

private void stopHandler(){

    Log.d(TAG, "stop handler");
    h.removeCallbacksAndMessages(null);
}


@Override
public void onDestroy() {
    //Log.d(TAG, "StopService AlertSound");
    if(mp!=null) {
        mp.stop();// Stop it
        mp.release();// Release it
    }
    stopHandler();
    super.onDestroy();
}}

Другие вопросы по теме