android - 如何防止Android在MediaPlayer播放时自动振动

标签 android kotlin vibration

我有一个闹钟应用程序,一些用户提示手机在闹钟期间振动,而振动应该被禁用。

经过一些挖掘我发现,在某些设备上有一个系统选项可以让设备随着闹钟音乐振动。例如,在我测试的 Pixel 4 中,它位于设置->声音&振动->振动&Heptics->警报振动。

此设置默认启用的原因是振动试图“模拟”通过 MediaPlayer 播放的音乐,我无法找到一种方法来防止这种情况在应用程序内发生,甚至无法检测是否存在此类设置/启用。

谁知道怎么解决? 这是我用于测试的示例方法:

private fun startThePlayer(context: Context, playInLoop: Boolean = true) {
    try {
        mediaPlayer.reset()
        mediaPlayer.isLooping = playInLoop
        val uri = Settings.System.DEFAULT_RINGTONE_URI
        mediaPlayer.setDataSource(context, uri)
        mediaPlayer.setOnPreparedListener {
            mediaPlayer.start()
        }
        mediaPlayer.prepareAsync()
    } catch (e: Exception) {
        log(e.toString())
    }
}

此功能需要 VIBRATE 许可。

对搭载 Android 13 的 Pixel 4 的影响: 设备在振动,好像在尝试“模仿”播放的音乐。振动强度取决于设备设置中设置的值,完全忽略为闹钟音乐设置的音量,并且还会扰乱直接在我的应用程序中设置的任何振动。

有趣的是,出于某种原因,Android 的默认时钟应用会忽略此设置,并且设备在闹钟期间不会振动。

最佳答案

首先,我建议您使用 android 的 VibratorManager 来控制您的应用振动设置(这就是 android 开发团队如何称呼此服务……多么奇怪)。使用 getDefaultVibratorcancel 方法停止您的应用程序产生的任何振动(官方 docs 来救援)

其次,因为您的应用程序是一个闹钟,请考虑使用 setWakeMode,这将使您的应用程序在后台运行,而不管显示屏如何(以防止闹钟在以下情况下停止)屏幕关闭)。这是 method documentation还有 PowerManager flags documentation

希望您能找到合适的组合来满足您的需求

关于android - 如何防止Android在MediaPlayer播放时自动振动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73948459/

相关文章:

kotlin - 为什么公共(public)课不能扩展私有(private)课?

java - 面对一些未知的问题一些后端 jvm 内部错误

java - Java 和 Kotlin 的模块系统有区别吗?

iphone - 如何检查 iOS 设备是否可以振动

android - 在水平和垂直回收 View 中滚动问题

android - Android Google Map Marker圈子(多个叠加层没有累积不透明度)

android - 位置选择器选择器输入小部件

android - 使用 Android 加速度计检测振动

c# - Xamarin Android 上的振动

Android 2.2 MediaPlayer 在一个 SHOUTcast URL 上工作正常,但在另一个 URL 上却不行