8

我想在来电时关闭设备振动设置。我已经为此功能实现了一个 BroadcastReceiver,它执行接收PHONE_STATE广播的操作。问题是我根本无法关闭振动。我尝试了以下方法:

AudioManager audioManager = (AudioManager)
                            context.getSystemService(Context.AUDIO_SERVICE);
audioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER, 
                               AudioManager.VIBRATE_SETTING_OFF);

或者

Vibrator vib = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
vib.cancel();

第一种方法对我来说似乎很理想。它甚至可以在接到电话时“打开”振动。但是,在这种情况下,我无法将它们“关闭”。

有人试过这个吗?

编辑:我检查了 Android 的电话应用程序代码。Ringer.java中存在以下代码:

if (shouldVibrate() && mVibratorThread == null) {
    mContinueVibrating = true;
    mVibratorThread = new VibratorThread();
    mVibratorThread.start();
}

一个线程最初由振动手机的电话应用程序启动。当我将振动设置更改为关闭时,将跳过此检查,但已经启动的线程继续运行。

这也解释了当来电时如何打开振动。在这种情况下,线程最初没有运行。然后,当我打开振动设置时它就开始了。如果不更改电话应用程序,我认为没有任何解决方案。

4

1 回答 1

0

这个:

Vibrator vib = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
vib.cancel();

不会对您有所帮助,因为它会取消振动器的新实例。

我可以想象,如果由于振动已经在进行中,呼叫已经到来,那么关闭设备的振动为时已晚。所以你必须在电话进来之前这样做。

于 2012-06-15T11:24:00.897 回答