【问题标题】:How to provide customized vibration on specific incoming calls如何为特定来电提供自定义振动
【发布时间】:2012-02-06 16:36:23
【问题描述】:

程序的功能是这样的:用户有一个电话号码列表,只有当没有其他系统范围的应用程序提供振动(例如在静音模式下)时,手机才能在来电时振动。我知道这在某种程度上违反了规则,因为应用程序应该尊重用户的设置,但应用程序仅限于某些有此需求的用户。我尝试了两种方法,但都不满意:

  1. 监听电话状态,直接用我自己的pattern(用Vibrator.vibrate())触发震动服务。这种方法在手机处于CALL_STATE_RINGING状态时有效,没有来电但随机有效,我猜这是因为与实际处理来电振动的系统范围的应用程序冲突。

  2. 来电时判断手机是否振动(AudioManager.shouldVibrate()),决定是否改变振动设置(AudioManager.setRingerMode()AudioManager.setVibrateSetting())。如果我的应用程序更改了振动设置,一旦手机回到CALL_STATE_IDLE 状态,它们将被恢复。但是,这种方法有时仍然不起作用,没有任何原因。

我希望有人可以就这个问题提供一些建议。欢迎对这两种方式发表评论或提出其他建议。

【问题讨论】:

  • @Rizon 很遗憾,没有,这个问题为我赢得了风滚草徽章。
  • 这不一样,但有人尝试在来电时禁用振动,但事实证明这是不可能的,但您的发现很有趣:stackoverflow.com/q/8065862/969325
  • @Warpzit 谢谢。看来如果我能在 Ringer 之前收到广播,问题就解决了。我不知道该怎么做,也许我应该检查一下 Ringer.java。
  • setVibrateSetting()setRingerMode() 似乎可以在我的手机上使用。你能发布你的代码吗?
  • @SergeyGlotov 好吧,实际上它们也适用于我的手机。问题出现在我朋友正在测试的设备上。我只是在寻找一些更强大的方法。代码太长太复杂,恐怕不是问题所在。

标签: android telephonymanager vibration android-audiomanager


【解决方案1】:

您需要使用两种设置才能让您的手机振动。第一个是声音模式,需要使用 AufioManager 设置:

AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
audioManager.setRingerMode(targetSoundMode);

第二部分没有正确记录,我认为这是您的代码中缺少的部分:

String VIBRATE_IN_SILENT_SETTING_NAME = "vibrate_in_silent";
Settings.System.putInt(getContentResolver(), VIBRATE_IN_SILENT_SETTING_NAME, 1);

使用 1 打开振动,使用 0 关闭振动。

要全面了解您应该如何使用振动设置和模式,请查看以下链接: http://hi-android.info/src/com/android/settings/SoundSettings.java.html

【讨论】:

  • 感谢您的回答!但这不是阻止振动器的原因,因为vibrate_in_silent 已经设置为 1。Phone.apk 是否有可能在我们触发后立即取消振动器?根据VibratorService.java,振动器在这种情况下会随机运行。这就解释了为什么这个问题只出现在某些手机上:Phone.apk 不是系统的一部分。
  • 你看过上面链接中的 setPhoneVibrateSettingValue 函数了吗?这两个设置之间存在一些依赖关系,应该非常小心地处理
  • 依赖是我错过的东西。我将在更多设备上对依赖项进行一些测试。提前致谢! +1 给你。
  • 链接已失效。我有同样的问题。你能帮我吗?
  • @Prince 您好,您可以在最新发布代码中查看SoundSettings.java
猜你喜欢
  • 1970-01-01
  • 2012-05-19
  • 2010-12-06
  • 2012-01-16
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
  • 2011-09-09
  • 1970-01-01
相关资源
最近更新 更多