Android的;检测设备中的振动设置是打开还是关闭,尤其是它响铃但不振动的情况

时间:2015-09-22 05:48:31

标签: android vibrate android-vibration android-settings

应用程序要求:检测手机何时开启振铃模式且振动设置为OFF 所以问题归结为:检测振动设置是关闭还是开启

相关信息:

首先, Vibrator没有像isVibratorModeOn()这样的方法 Flags related to VibrateEXTRA_VIBRATE_...都标记为已弃用:

  

此常量在API级别16中已弃用。应用程序应该   根据当前的振铃模式维持自己的振动策略   可以通过getRingerMode()查询。

但在getRingerMode()下,我们无法确切知道振动设置是否与RINGER_MODE_NORMAL关闭;

  

如果振动设置打开,它将振动。

现在{@ 3}}也已弃用。

用于检测* {大多数设备上的RINGER_MODE和o.s.的代码版本包括getVibrateSetting()

 if(audioManager.getRingerMode()!=AudioManager.RINGER_MODE_SILENT){
            if (audioManager.getStreamVolume(AudioManager.STREAM_RING) != 0) {  

*例外:Nexus 5 - 5.1.1,可能适用于所有Lollipop版本

如果错过了这一点我感到非常惊讶,或者我错过了一些显而易见的事情,从而犯了很大的错误。希望这不浪费你的时间。

以下是解释问题的更多内容:
涵盖RINGER_MODE_SILENT方案: Android M on Nexus 6

RINGER_MODE_VIBRATE方案涵盖: Scenario Covered - ringer silent mode

检测到这是问题:
Scenario Covered - ringer vibrate mode

来自Android M,Nexus 6的作物截图

3 个答案:

答案 0 :(得分:0)

试试这个,

用于检测振动

public static boolean detectVibrate(Context context){
    boolean status = false;
    AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
    if(am.getRingerMode() == AudioManager.RINGER_MODE_VIBRATE){
        status = true;
    } else if (1 == Settings.System.getInt(context.getContentResolver(), "vibrate_when_ringing", 0)) //vibrate on
        status = true;
    return status;
}

检查铃声已开启。

public static boolean checkRingerIsOn(Context context){
    AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
    return am.getRingerMode() == AudioManager.RINGER_MODE_NORMAL;
}

很高兴为您提供帮助。

答案 1 :(得分:0)

更新

解决方案有点扭曲,在其中一个循环中使用了弃用的方法,它已经在我测试的所有设备上工作;公司的; motorola,samsung,htc,lg,xiaomi,micromax,sony

audioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);

if (audioManager.getRingerMode() != AudioManager.RINGER_MODE_SILENT) {
   //ensuring it is not on silent
   if (audioManager.getRingerMode() == AudioManager.RINGER_MODE_VIBRATE) {
      //  if it is on vibrate mode , esp for api 23
   } else if (audioManager.getStreamVolume(AudioManager.STREAM_RING) != 0) {
             //  else check whether the volume is not 0
             if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1) {
             if (audioManager.getVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER) == AudioManager.VIBRATE_SETTING_ON  
 || audioManager.getVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER) == AudioManager.VIBRATE_SETTING_ONLY_SILENT) { //need to add this to detect a specific scenario in xiaomi device
       // if the device o.s version is not 23 this part works
              }
            }
if ((1 == Settings.System.getInt(ApplicationController.getInstance().getContentResolver(), Settings.System.VIBRATE_WHEN_RINGING, 0))) { 
       // the constant VIBRATE_WHEN_RINGING was added in api 23
       }
}

答案 2 :(得分:0)

修改后的解决方案:

即使是API&lt; 23和API 23这个工作正常。如果您不对以前的API使用弃用方法,那似乎很好。测试三星,摩托罗拉,OnePlus,谷歌Pixel,谷歌Nexus

AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
                int mode = am.getRingerMode();

            switch (mode) {
                case AudioManager.RINGER_MODE_NORMAL:
                    if ((1 == Settings.System.getInt(getContentResolver(), Settings.System.VIBRATE_WHEN_RINGING, 0))) {
                        // code here
                        Toast.makeText(getApplicationContext(), "=== ring + vibrate mode ===", Toast.LENGTH_LONG).show();
                    } else {
                        // code here
                        Toast.makeText(getApplicationContext(), "=== ring + no vibrate mode ===", Toast.LENGTH_LONG).show();
                    }
                    break;

                case AudioManager.RINGER_MODE_SILENT:
                    // code here
                    Toast.makeText(getApplicationContext(), "=== in silent mode ===", Toast.LENGTH_LONG).show();
                    break;

                case AudioManager.RINGER_MODE_VIBRATE:
                    // code here
                    Toast.makeText(getApplicationContext(), "=== in vibrate mode ===", Toast.LENGTH_LONG).show();
                    break;
            }