Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Play a ringtone when the phone is silent and keep the phone silent?

Tags:

android

I am building an alarm clock app, and when the phone is silent, i want it to play the alarm but keep the phone mode on silent. The alarm app I have right now (defualt samsung / android stock one) keeps the phone on silent mode but you still hear the alarm.

I tried setting it so I check if the audio is silent or vibrate, set the sound and then reset the audio.

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

    //get audiomanager and set the volume
    AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

    int oldVolume = 0;
    int maxVolume = 0;
    boolean silent = false;

    SoundMode soundMode = null;

    if (audioManager.getRingerMode() == AudioManager.RINGER_MODE_SILENT
            || audioManager.getRingerMode() == AudioManager.RINGER_MODE_VIBRATE) {

        if (audioManager.getRingerMode() == AudioManager.RINGER_MODE_SILENT) {
            soundMode = soundMode.SILENT;
        } else if (audioManager.getRingerMode() == AudioManager.RINGER_MODE_VIBRATE) {
            soundMode = soundMode.VIBRATE;
        }

        oldVolume = audioManager.getStreamVolume(AudioManager.STREAM_ALARM);
        maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM);
        maxVolume = maxVolume/2;

        audioManager.setStreamVolume(AudioManager.STREAM_ALARM, maxVolume, AudioManager.FLAG_ALLOW_RINGER_MODES);

        silent = true;

        Log.i(TAG, "silent if statement " + soundMode);
    }

   // audioManager.setStreamVolume(AudioManager.STREAM_ALARM, maxVolume / 2, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);

    Uri alarmTone = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
    ringtoneAlarm = RingtoneManager.getRingtone(getApplicationContext(), alarmTone);

    ringtoneAlarm.play();

    if (silent) {

        if (soundMode == SoundMode.SILENT) {
            Log.i(TAG, "silent mode");
            audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
        } else if (soundMode == SoundMode.VIBRATE) {
            Log.i(TAG, "vibrate mote");
            audioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
        }
    }

    return START_NOT_STICKY;
}

I've gotten to a point where the phone knows when it's silent or in vibrate mode, but it doesn't play the ringtone, it just either vibrates or doesn't make a noise. How do I make it so it plays the ringtone no matter what, but keeps the audio state the way it was?

like image 550
albert kim Avatar asked Feb 12 '16 03:02

albert kim


1 Answers

So after looking for some other questions this question Troubles play sound in silent mode on Android

solved it for me.

I had to use

RingtoneManager.getRingtone().setStreamType(AudioManager.STREAM_ALARM) and that played the alarm in silent mode.

like image 92
albert kim Avatar answered Nov 17 '22 17:11

albert kim