如何使Android设备振动?


Answers:


986

尝试:

import android.os.Vibrator;
...
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
// Vibrate for 500 milliseconds
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    v.vibrate(VibrationEffect.createOneShot(500, VibrationEffect.DEFAULT_AMPLITUDE));
} else {
    //deprecated in API 26 
    v.vibrate(500);
}

注意:

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

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

3
有没有办法消除所有手机的震动?谢谢!
哈维2014年

14
@joshsvoss这是500毫秒,仅是半秒。查看Google文档。developer.android.com/reference/android/os/Vibrator.html
cjayem13 2014年

5
它给了我:上下文无法解析或不是字段..?!这是什么问题
McLan

3
现在已弃用振动。请改用Hitesh Sahu的解决方案。
雷·李

2
API级别26中不推荐使用此方法。请vibrate(VibrationEffect)改用。
TimoBähr18年

651

授予振动许可

在开始实施任何振动代码之前,您必须授予应用程序振动的权限:

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

确保在AndroidManifest.xml文件中包含此行。

导入振动库

大多数IDE都会为您执行此操作,但是如果您没有,则这是import语句:

 import android.os.Vibrator;

在要发生振动的活动中确保执行此操作。

如何在给定的时间内振动

在大多数情况下,您需要在预定的短时间内振动设备。您可以使用vibrate(long milliseconds)方法来实现。这是一个简单的示例:

// Get instance of Vibrator from current Context
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

// Vibrate for 400 milliseconds
v.vibrate(400);

就是这样,很简单!

如何无限振动

您可能希望设备无限期地继续振动。为此,我们使用以下vibrate(long[] pattern, int repeat)方法:

// Get instance of Vibrator from current Context
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

// Start without a delay
// Vibrate for 100 milliseconds
// Sleep for 1000 milliseconds
long[] pattern = {0, 100, 1000};

// The '0' here means to repeat indefinitely
// '0' is actually the index at which the pattern keeps repeating from (the start)
// To repeat the pattern from any other point, you could increase the index, e.g. '1'
v.vibrate(pattern, 0);

当您准备停止振动时,只需调用以下cancel()方法:

v.cancel();

如何使用振动模式

如果要定制振动,可以尝试创建自己的振动模式:

// Get instance of Vibrator from current Context
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

// Start without a delay
// Each element then alternates between vibrate, sleep, vibrate, sleep...
long[] pattern = {0, 100, 1000, 300, 200, 100, 500, 200, 100};

// The '-1' here means to vibrate once, as '-1' is out of bounds in the pattern array
v.vibrate(pattern, -1);

更复杂的振动

有多个SDK提供了更全面的触觉反馈。我用于特殊效果的一个是Immersion的Android触觉开发平台

故障排除

如果您的设备不会振动,请首先确保它可以振动:

// Get instance of Vibrator from current Context
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

// Output yes if can vibrate, no otherwise
if (v.hasVibrator()) {
    Log.v("Can Vibrate", "YES");
} else {
    Log.v("Can Vibrate", "NO");
}

其次,请确保您已授予您的应用振动的权限!回到第一点。


26
很好的答案,尽管我会警惕无限期地振动。使用此功能时,请负责!
戴夫

4
好的答案,但有一件事情。当您说“ 0”表示无限期重复时,虽然是正确的,但还是有点误导。此数字是重复时图案将从其开始的图案数组的索引。
aaronvargas 2014年

1
@aaronvargas公平的观点,尽管这超出了大多数人试图实现的范围。我
去做

@Liam George Betsworth即使手机处于静音模式,我也该如何振动?请。
Parthi 2015年

1
沉浸式链接关闭,我在archive.org上找不到它:(
looper

73

Android-O(API 8.0)不推荐使用Update 2017振动(间隔)方法

要支持所有Android版本,请使用此方法。

// Vibrate for 150 milliseconds
private void shakeItBaby() {
    if (Build.VERSION.SDK_INT >= 26) {
        ((Vibrator) getSystemService(VIBRATOR_SERVICE)).vibrate(VibrationEffect.createOneShot(150, VibrationEffect.DEFAULT_AMPLITUDE));
    } else {
        ((Vibrator) getSystemService(VIBRATOR_SERVICE)).vibrate(150);
    }
}

科特林:

// Vibrate for 150 milliseconds
private fun shakeItBaby(context: Context) {
    if (Build.VERSION.SDK_INT >= 26) {
        (context.getSystemService(VIBRATOR_SERVICE) as Vibrator).vibrate(VibrationEffect.createOneShot(150, VibrationEffect.DEFAULT_AMPLITUDE))
    } else {
        (context.getSystemService(VIBRATOR_SERVICE) as Vibrator).vibrate(150)
    }
}

2
我们不需要振动的运行时权限。振动不是危险的许可,因此只能在清单中声明。[ developer.android.com/guide/topics/permissions/…–
Roon13

@BugsHappen文档已移动。将对其进行更新或删除。
Roon13

我唯一要添加的是,如果您在Activity中使用此变量,并且没有特定的Context变量,请替换getSystemServicethis.getContext().getSystemService
DrMcCleod

您的先生赢得了赞誉,因为该函数名称为touché–
Starwave

18

以上答案是完美的。但是,我想在单击按钮时使我的应用程序精确振动两次,因此这里缺少这些小信息,因此请像我这样的未来读者发布。:)

如上所述,我们必须遵循,唯一的变化就是振动模式如下,

long[] pattern = {0, 100, 1000, 300};
v.vibrate(pattern, -1); //-1 is important

这将恰好振动两次。我们已经知道

  1. 0是延迟
  2. 100说第一次振动 100毫秒
  3. 接下来是1000ms的延迟
  4. 然后再振动 300毫秒

一个人可以继续提及延迟和振动(例如0、100、1000、300、1000、300表示3次振动,依此类推),但请记住@Dave的话负责任地使用它。:)

在此还要注意,repeat参数设置为-1,这意味着振动将完全按照模式中所述发生。:)


为什么-1表示振动将完全按照模式中所述发生?谢谢!
Ruchir Baronia 2015年

@Rich请参考我的回答。-1是第一次遵循该模式后振动将尝试从其重复的索引。“ -1”超出范围,因此振动不会重复。
Liam George Betsworth 2015年

@Rich-Liam George Betsworth是正确的。Android文档说-要导致模式重复,请将索引传递到开始重复的模式数组中,或将-1禁用以禁用重复。链接- developer.android.com/reference/android/os/...,INT)
阿图尔Ø狂热

14

我很难理解如何在第一个实现中执行此操作-确保您具有以下条件:

1)您的设备支持振动(我的三星平板电脑无法正常工作,因此我不断检查代码-原始代码在CM触摸板上可正常使用

2)您已在AndroidManifest.xml文件中的应用程序级别上方声明,以赋予代码运行权限。

3)将以下两项与其他项导入到您的MainActivity.java中:import android.content.Context; 导入android.os.Vibrator;

4)调用您的振动(已经在此线程中进行了广泛讨论)-我在一个单独的函数中完成了此操作,并在其他点的代码中调用了它-根据您要用来调用振动的内容,您可能需要一张图片(Android:长按按钮->执行动作)或按钮监听器,或XML中定义的可点击对象(Clickable image-android):

 public void vibrate(int duration)
 {
    Vibrator vibs = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
    vibs.vibrate(duration);    
 }

10

未经许可振动

如果您只想使设备振动一次,以提供有关用户操作的反馈。您可以使用的performHapticFeedback()功能View。这不需要VIBRATE在清单中声明权限。

在项目的Utils.kt之类的一些通用类中,将以下函数用作顶级函数:

/**
 * Vibrates the device. Used for providing feedback when the user performs an action.
 */
fun vibrate(view: View) {
    view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)
}

然后在您的任何位置FragmentActivity以下位置使用它:

vibrate(requireView())

就那么简单!


2
好又简单的解决方案!
VAdaihiep


4

我使用以下utils方法:

public static final void vibratePhone(Context context, short vibrateMilliSeconds) {
    Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
    vibrator.vibrate(vibrateMilliSeconds);
}

将以下权限添加到AndroidManifest文件

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

如果希望使用上述建议的不同类型的振动(模式/不确定),则可以使用重载方法。


4

上面的答案是非常正确的,但是我给出了一个简单的步骤:

 private static final long[] THREE_CYCLES = new long[] { 100, 1000, 1000,  1000, 1000, 1000 };

  public void longVibrate(View v) 
  {
     vibrateMulti(THREE_CYCLES);
  }

  private void vibrateMulti(long[] cycles) {
      NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
      Notification notification = new Notification();

      notification.vibrate = cycles; 
      notificationManager.notify(0, notification);
  }

然后在您的xml文件中:

<button android:layout_height="wrap_content" 
        android:layout_width ="wrap_content" 
        android:onclick      ="longVibrate" 
        android:text         ="VibrateThrice">
</button>

那是最简单的方法。


3

图案/波中振动:

import android.os.Vibrator;
...
// Vibrate for 500ms, pause for 500ms, then start again
private static final long[] VIBRATE_PATTERN = { 500, 500 };

mVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    // API 26 and above
    mVibrator.vibrate(VibrationEffect.createWaveform(VIBRATE_PATTERN, 0));
} else {
    // Below API 26
    mVibrator.vibrate(VIBRATE_PATTERN, 0);
}

所需的许可AndroidManifest.xml

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

3

Kotlin更新以提供更多类型的安全性

在项目的某些常见类(如Utils.kt)中将其用作顶层函数

// Vibrates the device for 100 milliseconds.
fun vibrateDevice(context: Context) {
    val vibrator = getSystemService(context, Vibrator::class.java)
    vibrator?.let {
        if (Build.VERSION.SDK_INT >= 26) {
            it.vibrate(VibrationEffect.createOneShot(100, VibrationEffect.DEFAULT_AMPLITUDE))
        } else {
            @Suppress("DEPRECATION")
            it.vibrate(100)
        }
    }
}

然后在代码中的任意位置调用它,如下所示:

vibrateDevice(requireContext())

说明

使用Vibrator::class.java类型比使用String常量更安全。

我们vibrator使用来检查的可否使用性let { },因为如果设备没有振动,vibrator则将为null

可以在else子句中禁止弃用,因为警告来自较新的SDK。

我们不需要在运行时请求使用振动的许可。但是我们需要声明AndroidManifest.xml如下:

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

2

用这个:

import android.os.Vibrator;
     ...
     Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
     // Vibrate for 1000 milliseconds
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            v.vibrate(VibrationEffect.createOneShot(1000,VibrationEffect.DEFAULT_AMPLITUDE));
     }else{
     //deprecated in API 26 
            v.vibrate(1000);
     }

注意:

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

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

1

您可以振动设备及其工作

   Vibrator v = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
           v.vibrate(100);

权限是必需的,但不需要运行时权限

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

此解决方案已弃用
BekaBot
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.