【问题标题】:Vibrate setting not turning off on receiving incoming call - Android接听来电时振动设置未关闭 - Android
【发布时间】:2011-11-09 13:41:34
【问题描述】:

我想在来电时关闭设备振动设置。我已经为此功能实现了一个 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();
}

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

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

【问题讨论】:

  • 我也会对此感兴趣。据我所知是这样的:启动振动的线程或上下文是唯一可以在以后停止它的线程或上下文。关于更改振动设置:android 中似乎存在错误。如果设置更改,不会向听众发送通知,因此振动无法停止。
  • 你好阿曼,你解决了这个问题吗?我面临同样的问题,希望你能帮助我解决同样的问题。

标签: android vibration


【解决方案1】:

这个:

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

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

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

【讨论】:

  • 我只想在来电来自所选联系人之一时更改振动设置。因此,在来电之前更改振动设置不是一种选择。由于Android允许在来电后更改铃声模式和铃声音量,我希望也可以更改振动。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-24
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
相关资源
最近更新 更多