如何为特定来电提供自定义振动

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

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

以上是关于如何为特定来电提供自定义振动的主要内容,如果未能解决你的问题,请参考以下文章

如何为特定视图的导航栏设置自定义背景图像

如何为反应表 7 提供自定义排序功能?

如何为 Elastic Beanstalk 的 Tomcat 实例提供自定义日志附加程序?

如何为 ASP.NET MVC 2 创建自定义成员资格提供程序?

如何为 ios 本地通知内容提供自定义辅助功能文本 - UNNotificationContent

如何为可编码对象提供自定义代码功能