在安卓程序中编程实现振动的启用和禁用

8
在我的一个安卓应用中,我需要完全启用或禁用振动,无论是在静音、普通还是响铃模式下。目前,我正在使用以下代码,并借助于已弃用的函数setVibrateSetting:
// 打开振动模式
audio.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,
            AudioManager.VIBRATE_SETTING_ON);
audio.setVibrateSetting(AudioManager.VIBRATE_TYPE_NOTIFICATION,
            AudioManager.VIBRATE_SETTING_ON);

// 关闭震动模式的方法

audio.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,
            AudioManager.VIBRATE_SETTING_OFF);
audio.setVibrateSetting(AudioManager.VIBRATE_TYPE_NOTIFICATION,
            AudioManager.VIBRATE_SETTING_OFF);

但是,我想知道是否有明确的方法来做到这一点。
欢迎提出建议 :)
敬礼, Jujare

看一下这个答案:http://stackoverflow.com/questions/11965586/android-setvibratesetting-deprecated - michelesama
谷歌在这里不当地使用了弃用,因为没有其他方法可以更改系统范围内的振动设置。 - Shirish Herwade
"Deprecation"这个词总是让开发人员感到困惑。它的意思是有一种更好的方法可用,而不是说你不能使用它! - Shirish Herwade
4个回答

5

setVibrateSetting()的弃用文本如下:

该方法只应由替换平台音频设置管理或主要电话应用程序的应用程序使用。

据我所知,没有其他选项可以全局启用或禁用振动,因此如果您有一个类似于铃声配置文件管理器的应用程序,则可能需要使用它。

在我看来,Google 在此处不适当地使用了弃用。

我使用以下类将弃用隐藏在一个“compat”类中:

@SuppressWarnings("deprecation")
class AudioManagerCompat {
    final static int VIBRATE_TYPE_RINGER = AudioManager.VIBRATE_TYPE_RINGER;
    final static int VIBRATE_TYPE_NOTIFICATION = AudioManager.VIBRATE_TYPE_NOTIFICATION;
    final static int VIBRATE_SETTING_ON = AudioManager.VIBRATE_SETTING_ON;
    final static int VIBRATE_SETTING_OFF = AudioManager.VIBRATE_SETTING_OFF;
    final static int VIBRATE_SETTING_ONLY_SILENT = AudioManager.VIBRATE_SETTING_ONLY_SILENT;

    static int getVibrateSetting(AudioManager am, int vibrateType) {
        return am.getVibrateSetting(vibrateType);
    }

    static void setVibrateSetting(AudioManager am, int vibrateType, int vibrateSetting) {
        am.setVibrateSetting(vibrateType, vibrateSetting);
    }
}

3
在我看来,Google在这里不恰当地使用了“弃用(deprecation)”这个词。您是正确的,因为没有其他方法可以更改系统范围的振动设置。但是,“弃用”这个词通常会让开发人员感到困惑。弃用意味着有一种更好的方式可用,而不是不能使用它! - Muhammad Babar

1
您可以使用以下代码行:

Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

vibration.cancel();

1

这是我的代码

switch (position) {
    case 0:
        audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
        break;
    case 1:
        audioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
        break;
    case 2:
        audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
        audioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER, 
                AudioManager.VIBRATE_SETTING_OFF);
        break;
    case 3:
        audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
        audioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER, 
                AudioManager.VIBRATE_SETTING_ON);
        break;
    }

当我使用Gingerbread和IceCreamSandwich的Nexus S时,setVibrateSetting工作正常,我是在ICS上开发它的,然而最近我发现它在Jelly Bean上不起作用,getVibrateSetting也不起作用。等待更好的解决方法~


-3

请查看this,我在谷歌上找到了这个作为第一个结果。代码如下:

if(isVibrate){
Vibrator vib = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);  
     vib.vibrate(500);
      Toast.makeText(this, "vib started", Toast.LENGTH_LONG).show();
}

else{

// do nothing

}

谢谢你提供的代码。但是,我的问题是如何在系统级别上禁用或启用振动。我的问题不是关于如何使用振动器设备。 - NoOne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接