如何在特定来电时提供定制震动

22
这个程序的功能如下:用户有一组电话号码,在静音模式下,只有当没有其他系统应用程序提供震动(例如 :来电时)时,手机才会震动。我知道这与规则有所违背,因为应用程序应该尊重用户的设置,但是该应用程序仅限于某些需要此功能的用户。我已经尝试了两种方法,但都不令人满意:
1. 监听电话状态,并使用自己的模式直接触发振动服务(使用Vibrator.vibrate())。此方法在没有来电时非常有效,但在手机处于CALL_STATE_RINGING状态时随机生效,我猜测这是由于与实际处理来电时的振动的系统级应用程序之间的冲突引起的。
2. 判断手机是否在来电时震动(使用AudioManager.shouldVibrate()),并决定是否更改振动设置(使用AudioManager.setRingerMode()AudioManager.setVibrateSetting())。如果我的应用程序更改了振动设置,则在手机恢复到CALL_STATE_IDLE状态后,将还原这些设置。然而,这种方法仍然有时无法正常工作,没有任何原因的迹象。
希望有人能就此问题提供建议。欢迎对这两种方式或其他建议进行评论。

2
@Rizon 很遗憾,这个问题让我获得了一个荒漠草莓徽章。 - peter
这不是同样的问题,但有人尝试禁用来电震动并证明它是不可能的,但这些发现对您很有趣:https://dev59.com/1F3Ua4cB1Zd3GeqP9A4B - Warpzit
@Warpzit 谢谢。如果我能在 Ringer 之前接收到广播,问题就解决了。我不确定如何做到这一点,也许我应该查看 Ringer.java。 - peter
setVibrateSetting()setRingerMode()在我的手机上似乎可以工作。你能发一下你的代码吗? - Sergey Glotov
@SergeyGlotov 嗯,实际上它们也适用于我的手机。问题出现在正在测试的朋友设备上。我只是在寻找更加稳健的方法。代码太长且复杂,我担心问题不在那里。 - peter
你好 Peter。我遇到了同样的问题。你能帮我吗?请提供一些代码。 - Hardik Joshi
1个回答

6

你需要调整两个设置才能让手机振动。第一个是声音模式,需要使用AudioManager进行设置:

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 不是系统的一部分。 - peter
2
你看过上面链接中的setPhoneVibrateSettingValue函数吗?这两个设置之间存在一些依赖关系,需要非常小心地处理。 - Muzikant
我错过了依赖项。我将在更多设备上执行一些依赖项测试。提前致谢!+1 给你。 - peter
链接无效。我遇到了同样的问题。你能帮我吗? - Hardik Joshi
@peter 好的,让我来检查一下。只是想知道是否可以在来电时设置振动级别?我已经提出了问题:http://stackoverflow.com/questions/26804939/how-to-change-incoming-call-vibration-level-when-incoming-call-made - Hardik Joshi
显示剩余3条评论

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