Skip to content

Instantly share code, notes, and snippets.

@aVolpe
Created October 16, 2014 02:45
Show Gist options
  • Save aVolpe/707c8cf46b1bb8dfb363 to your computer and use it in GitHub Desktop.
Save aVolpe/707c8cf46b1bb8dfb363 to your computer and use it in GitHub Desktop.
Vibration for Unity3d with Android native Call, with fallback to Handlheld.Vibrate()
using UnityEngine;
using System.Collections;
public static class Vibration
{
#if UNITY_ANDROID && !UNITY_EDITOR
public static AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
public static AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
public static AndroidJavaObject vibrator = currentActivity.Call<AndroidJavaObject>("getSystemService", "vibrator");
#else
public static AndroidJavaClass unityPlayer;
public static AndroidJavaObject currentActivity;
public static AndroidJavaObject vibrator;
#endif
public static void Vibrate()
{
if (isAndroid())
vibrator.Call("vibrate");
else
Handheld.Vibrate();
}
public static void Vibrate(long milliseconds)
{
if (isAndroid())
vibrator.Call("vibrate", milliseconds);
else
Handheld.Vibrate();
}
public static void Vibrate(long[] pattern, int repeat)
{
if (isAndroid())
vibrator.Call("vibrate", pattern, repeat);
else
Handheld.Vibrate();
}
public static bool HasVibrator()
{
return isAndroid();
}
public static void Cancel()
{
if (isAndroid())
vibrator.Call("cancel");
}
private static bool isAndroid()
{
#if UNITY_ANDROID && !UNITY_EDITOR
return true;
#else
return false;
#endif
}
}
@debianop
Copy link

debianop commented Dec 5, 2020

Thanks for good class.

@zxt5105515
Copy link

in unity2019.4.10f1,

get error c# exception:UnityEngine.AndroidJavaException: java.lang.NoSuchMethodError: no non-static method with name='vibrate' signature='()V' in class Landroid.os.SystemVibrator;

change vibrator.Call("vibrate"); to vibrator.Call("vibrate" ,100); may fix it

@agustinaA-Lopez
Copy link

didn't work with Vibration.vibrate(x) but it does with Vibration1.vibrate(x). didn't change the script Vibration.cs. The mystery of informatics ...
Other than that works perfect! thank you!!!

This doesn't seem to be working for me. I get the following error when running:
Vibration' is missing the class attribute 'ExtensionOfNativeClass'!

I changed the class name from Vibration-->Vibration1 and that got rid of the error. But when calling Vibration1.Vibrate() the console prints iPhoneUtils.Vibrate() implying it's using Handheld.Vibrate() which isn't working for Android.

(I'm using Unity 2018.3.0 and testing w/ UnityRemote 5)

Edit: found out that debugging in UnityRemote does not support vibrations... that's probably the crux of it. When building, Handheld.Vibrate() worked

@diliupg
Copy link

diliupg commented Feb 24, 2021

Great code. Worrks well in Unity 2020.1.17f1. Thanks! Be blessed!

@alllt1r
Copy link

alllt1r commented Apr 1, 2021

Thank you for this, everything works great!
Unity 2020.3.2f1 Personal
Vibration.Vibrate(100);

@SamKyada
Copy link

SamKyada commented Sep 14, 2021

'Vibration' is missing the class attribute 'ExtensionOfNativeClass'!
how to Solve this error.......
Unity 2020.3.17f1

@khOsman1917
Copy link

Thank you😊

@maryphun
Copy link

Doesn't expect this still work in 2022.
You're a hero

@diliupg
Copy link

diliupg commented Jan 21, 2022

@SamKyada , read the reply by @agustinaA-Lopez

@pflosch
Copy link

pflosch commented Dec 19, 2023

meanwhile 2023, Android14, copy, paste, works like a charm.
Thanks @aVolpe , you're the man...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment