对 Android 中的触觉反馈感到困惑

Posted

技术标签:

【中文标题】对 Android 中的触觉反馈感到困惑【英文标题】:Confused about haptic feedback in Android 【发布时间】:2014-11-03 02:06:21 【问题描述】:

我有一个带有 9 个按钮的 android 应用。此应用程序在 2.36 上运行,并且是设备上唯一的应用程序(或者至少是我们让用户使用的唯一应用程序 - 我们在交付设备时预装了我们的代码,作为我们销售的工业产品套件的一部分。)

所有按钮都转到同一个处理程序并通过它们的标签进行分类。处理程序在 XML 中指定:

   <Button android:id="@+id/IdleButton"
     android:layout_marginLeft="5dp"
     android:background="@drawable/idle18pt_he_normal"
     android:hapticFeedbackEnabled="true"
     android:layout_
     android:layout_
     android:tag="0"
     android:onClick="theButtonHandler">
   </Button> 

我想在用户按下按钮时启用触觉反馈,即振动。有没有办法在 XML 中做到这一点,或者如果没有,有没有办法在我的 onClick() 处理程序中做到这一点?

我在 Android 上看到的关于触觉反馈的网络示例(例如,http://androidcookbook.com/Recipe.seam?recipeId=1242)似乎主要涉及对清单的更改、对 XML 的更改(您可以看到我已经在我的 XML 中启用了它,上面) 然后为按钮声明、初始化和实现一个单独的 Touch 处理程序。这似乎需要做很多工作,尤其是因为我有 9 个按钮。

由于我的所有按钮都只有一个 onClick 处理程序,有没有一种方法可以在那里实现触觉反馈?

当我点击我的一个按钮时,我所要做的就是在手机设置的“声音”部分中勾选“可听选择”——根本不需要编码。为什么触觉反馈要复杂得多?

【问题讨论】:

【参考方案1】:

未使用VIBRATE 权限。

您可以使用任何ViewperformHapticFeedback() 函数,包括Button

例如在 Kotlin 中以编程方式:

view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)

这会使设备振动。

您可以在FragmentActivity 中的任何位置振动设备,即使您没有可用的View

在 Fragment 中你可以这样做:

requireView().performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)

在活动中你做的:

window.decorView.rootView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)

【讨论】:

能否提供您的设备名称和操作系统版本?因为此解决方案不适用于我的任何设备。 @LibinThomas,我已经成功地从 Lollipop 开始测试。我相信这也适用于旧版本,因为对 performHapticFeedback() 的支持可以追溯到 Android API 3。 检查了 OnePlus 设备,它们都没有工作。如果遗漏了什么,你能指导我吗?甚至我也添加了振动器权限-谢谢 @LibinThomas,此功能不需要振动器权限。如果您没有设备,请使用模拟器检查您的代码是否适用于旧版本的 Android。除了Fragment,您还可以尝试更具体的View。最后,如果此解决方案对您不起作用,您始终可以使用振动的权限方式。你可以在这个question找到代码。 @LibinThomas,对于第一个解决方案,请尝试添加标志,所以不要使用上面的代码,而是像这样使用它:requireView().performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING)【参考方案2】:

创建一个继承自Button的自定义VibrateButton类,并添加此振动onClick。您仍然需要在 Manifest 中请求权限,因此如果没有继承,您将无能为力。此示例代码取自from here,并做振动。

import android.os.Vibrator;
...
Vibrator v = (Vibrator) this.context.getSystemService(Context.VIBRATOR_SERVICE);
// Vibrate for 500 milliseconds
v.vibrate(500);

注意:

不要忘记在 AndroidManifest.xml 文件中包含权限:

<uses-permission android:name="android.permission.VIBRATE"/>

按钮可以自动设置声音,但不能自动设置振动的原因,与它要求允许振动的权限相同。振动会消耗电池(不仅仅是简单的声音),因此它会影响电池持续时间,这需要以某种方式得到最终用户的批准。如果您看到,在大多数情况下,某些特定按钮(主要是键盘应用程序)有一个“点击时振动”选项,但这取决于每个应用程序。

PS:确保设备可以振动。在为 Nexus 7 2012 添加振动时,我愚蠢地浪费了几个小时;它没有振动模块。此外,请确保您可以禁用它,以延长电池续航时间。

【讨论】:

以上是关于对 Android 中的触觉反馈感到困惑的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.Forms iOS 依赖服务中的触觉反馈崩溃

对android运行时权限感到困惑

对签署 android APK 感到困惑?

Android M 权限:对 shouldShowRequestPermissionRationale() 函数的用法感到困惑

VREP中的力触觉设备接口(CHAI3D)

对 Android 应用程序崩溃的原因以及 API 级别的含义感到困惑