How to make an Android device vibrate? with different frequency?

382,721

Solution 1

Try:

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);
}

Note:

Don't forget to include permission in AndroidManifest.xml file:

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

Solution 2

Grant Vibration Permission

Before you start implementing any vibration code, you have to give your application the permission to vibrate:

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

Make sure to include this line in your AndroidManifest.xml file.

Import the Vibration Library

Most IDEs will do this for you, but here is the import statement if yours doesn't:

 import android.os.Vibrator;

Make sure this in the activity where you want the vibration to occur.

How to Vibrate for a Given Time

In most circumstances, you'll be wanting to vibrate the device for a short, predetermined amount of time. You can achieve this by using the vibrate(long milliseconds) method. Here is a quick example:

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

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

That's it, simple!

How to Vibrate Indefinitely

It may be the case that you want the device to continue vibrating indefinitely. For this, we use the vibrate(long[] pattern, int repeat) method:

// 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);

When you're ready to stop the vibration, just call the cancel() method:

v.cancel();

How to use Vibration Patterns

If you want a more bespoke vibration, you can attempt to create your own vibration patterns:

// 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);

More Complex Vibrations

There are multiple SDKs that offer a more comprehensive range of haptic feedback. One that I use for special effects is Immersion's Haptic Development Platform for Android.

Troubleshooting

If your device won't vibrate, first make sure that it can vibrate:

// 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");
}

Secondly, please ensure that you've given your application the permission to vibrate! Refer back to the first point.

Solution 3

Update 2017 vibrate(interval) method is deprecated with Android-O(API 8.0)

To support all Android versions use this method.

// 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);
    }
}

Kotlin:

// 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)
    }
}

Solution 4

Vibrate without using permission

If you want to simply vibrate the device once to provide a feedback on a user action. You can use performHapticFeedback() function of a View. This doesn't need the VIBRATE permission to be declared in the manifest.

Use the following function as a top level function in some common class like Utils.kt of your project:

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

And then use it anywhere in your Fragment or Activity as following:

vibrate(requireView())

Simple as that!

Solution 5

Above answers are perfect. However I wanted to vibrate my app exactly twice on button click and this small information is missing here, hence posting for future readers like me. :)

We have to follow as mentioned above and the only change will be in the vibrate pattern as below,

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

This will exactly vibrate twice. As we already know

  1. 0 is for delay
  2. 100 says vibrate for 100ms for the first time
  3. next comes delay of 1000ms
  4. and post that vibrate again for 300ms

One can go on and on mentioning delay and vibration alternatively (e.g. 0, 100, 1000, 300, 1000, 300 for 3 vibrations and so on..) but remember @Dave's word use it responsibly. :)

Also note here that the repeat parameter is set to -1 which means the vibration will happen exactly as mentioned in the pattern. :)

Share:
382,721
Billie
Author by

Billie

Updated on July 08, 2022

Comments

  • Billie
    Billie almost 2 years

    I wrote an Android application. Now, I want to make the device vibrate when a certain action occurs. How can I do this?

  • Dave
    Dave almost 11 years
    Excellent answer, although I would be wary of playing a vibration indefinitely. Please be responsible when using this feature!
  • Javi
    Javi about 10 years
    Is there a way to cancel the vibration of all the phone? thanks!
  • cjayem13
    cjayem13 over 9 years
    @joshsvoss It's 500 milliseconds which is just half a second. Check out google docs. developer.android.com/reference/android/os/Vibrator.html
  • tmele54
    tmele54 over 9 years
    Great answer, but one thing. When you say 'The '0' here means to repeat indefinitely', although true, is a bit misleading. This number is the Index of the pattern array that the pattern will start at when repeating.
  • Liam George Betsworth
    Liam George Betsworth over 9 years
    @aaronvargas Fair point, though that's out of the scope of what most people are trying to achieve. I went for a simple explanation :)
  • McLan
    McLan over 9 years
    it gives me: context cannot be resolved or is not a field .. ?! what is the problem
  • Parthi
    Parthi almost 9 years
    @Liam George Betsworth How do I vibrate even the mobile is in silent mode? please.
  • Muhammad Saqib
    Muhammad Saqib over 8 years
    @Dave as I have to forcibly close my app :)
  • Ruchir Baronia
    Ruchir Baronia over 8 years
    Why does -1 mean the vibration will happen exactly as mentioned in the pattern? Thanks!
  • Liam George Betsworth
    Liam George Betsworth over 8 years
    @Rich Please refer to my answer. The '-1' is the index at which the vibration will try to repeat from, after following the pattern for the first time. '-1' is out of bounds, therefore the vibration does not repeat.
  • Atul O Holic
    Atul O Holic over 8 years
    @Rich - Liam George Betsworth is correct. Android docs say - To cause the pattern to repeat, pass the index into the pattern array at which to start the repeat, or -1 to disable repeating. Link - developer.android.com/reference/android/os/…, int)
  • McLan
    McLan over 7 years
    It does repeat the pattern forever, but how about vibrating for 3 times only for example (i.e.: start + vibrate + sleep + vibrate + sleep + vibrate + stop) ?!!
  • Liam George Betsworth
    Liam George Betsworth over 7 years
    @Suda.nese Read the section on 'how to use vibration patterns'. Something like: long[] pattern = {0, 100, 100, 100, 100, 100}; v.vibrate(pattern, -1);
  • looper
    looper about 7 years
    The immersion-link is down and I can't find it on archive.org :(
  • Filip Petrovic
    Filip Petrovic almost 7 years
    And it switches between SLEEP and THEN VIBRATE. Not the other way around.
  • Liam George Betsworth
    Liam George Betsworth almost 7 years
    @FilipPetrovic That is mentioned in the code comments. I think you missed the 'start without delay' comment on the line above. Apologies if this is confusing.
  • Ray Li
    Ray Li over 6 years
    vibrate is now deprecated. Use the solution by Hitesh Sahu instead.
  • Roon13
    Roon13 over 6 years
    We don't need runtime permission for Vibration. Vibration is not a dangerous permission, so it has to be only declared in the manifest. [developer.android.com/guide/topics/permissions/…
  • Timo Bähr
    Timo Bähr over 6 years
    This method was deprecated in API level 26. Use vibrate(VibrationEffect) instead.
  • ArtiomLK
    ArtiomLK over 6 years
    Don't forget to uninstall the app if you are creating a NotificationChannel for Notfication. Otherwise the pattern does not override the previous vibration patterns.
  • user55924
    user55924 about 6 years
    Use Vibrator v=(Vibrator) getContext().getSystemService(Context.VIBRATOR_SERVICE); v.vibrate(50); if you are doing it from dialog.
  • Roon13
    Roon13 almost 6 years
    @BugsHappen documentation moved. Will update it or delete it.
  • DrMcCleod
    DrMcCleod over 5 years
    The only thing that I would add is that if you are using this in an Activity and don't have a specific Context variable, then replace getSystemService with this.getContext().getSystemService
  • Starwave
    Starwave over 5 years
    you sir earned an upvote 'cause of that functions name, touché
  • BekaBot
    BekaBot almost 5 years
    this solution is deprecated
  • Irfan Akram
    Irfan Akram about 4 years
    @LiamGeorgeBetsworth - Is there any way to get vibration continuously without any delay or somewhere delay but in a random manner rather than a specific (as you described above as vibrate, delay, vibrate, delay ... )?
  • Gyro Gearloose
    Gyro Gearloose over 3 years
    I've tried your code and it works perfectly. But if "Battery saver" is on and the device is not connected to a power supply ("charging"), nothing happens. I guess this is a "feature" that prevents power consumption.
  • G00fY
    G00fY over 3 years
    Make sure to add the HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING flag so that it works on all devices.
  • Ridcully
    Ridcully about 3 years
    Actually, this will pause for 500ms, vibrate for 500ms then start again