App requirement: To detect when a phone is on Ringing mode with the Vibrate Setting being OFF so the problem comes down to : detect whether the Vibrate Setting is OFF or ON
Relevant information:
To start with,
Vibrator has no method like isVibratorModeOn()
and the
Flags related to Vibrate and EXTRA_VIBRATE_... are all marked deprecated with:
This constant was deprecated in API level 16. Applications should maintain their own vibrate policy based on current ringer mode that can be queried via getRingerMode().
But under getRingerMode(), we won't exactly know if the vibrate setting is off or not with RINGER_MODE_NORMAL;
It will vibrate if the vibrate setting is on.
Now the getVibrateSetting() is also deprecated.
Code which works for detecting the RINGER_MODE
on *most devices and o.s. versions including Android M on Nexus 6:
if(audioManager.getRingerMode()!=AudioManager.RINGER_MODE_SILENT){
if (audioManager.getStreamVolume(AudioManager.STREAM_RING) != 0) {
*Exception: Nexus 5 - 5.1.1, probably for all Lollipop versions
I feel its very surprising if this has been missed or i've made the big(gest) silly mistake by missing something obvious. Hopefully, this isn't a waste of your time.
Here's more to explain the problem:
RINGER_MODE_SILENT
scenario covered:
RINGER_MODE_VIBRATE
scenario covered:
DETECTING THIS IS THE PROBLEM:
Screenshot crops from Android M, Nexus 6
Try this,
for detect vibrate
check ringer is on.
Happy to Help you.
Modified solution to the one given:
Even for API < 23 and API 23 this works fine. It seems fine if you do not use deprecated methods for previous APIs. Tested on Samsung, Motorola, OnePlus, Google Pixel, Google Nexus
Update:
the solution is a bit twisted, using a deprecated method in one of the loops, it has worked on all devices i have tested; those of companies; motorola, samsung, htc, lg, xiaomi, micromax, sony