Jak sprawić, by urządzenie z Androidem wibrowało?


499

Napisałem aplikację na Androida. Teraz chcę sprawić, aby urządzenie wibrowało, gdy nastąpi określone działanie. W jaki sposób mogę to zrobić?

Odpowiedzi:


987

Próbować:

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

Uwaga:

Nie zapomnij dołączyć uprawnienia do pliku AndroidManifest.xml:

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

3
Czy istnieje sposób na anulowanie wibracji całego telefonu? dzięki!
Javi,

14
@joshsvoss To 500 milisekund, co jest tylko pół sekundy. Sprawdź dokumenty Google. developer.android.com/reference/android/os/Vibrator.html
cjayem13

5
daje mi to: kontekstu nie można rozwiązać lub nie jest polem ..?! w czym problem
McLan,

3
wibracja jest teraz przestarzała. Zamiast tego skorzystaj z rozwiązania Hitesh Sahu.
Ray Li

2
Ta metoda została wycofana z poziomu 26 interfejsu API. vibrate(VibrationEffect)Zamiast tego należy użyć .
Timo Bähr

651

Udziel pozwolenia na wibracje

Zanim zaczniesz implementować kod wibracyjny, musisz zezwolić aplikacji na wibrowanie:

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

Pamiętaj, aby dołączyć ten wiersz do pliku AndroidManifest.xml.

Zaimportuj bibliotekę wibracji

Większość IDE zrobi to za Ciebie, ale oto instrukcja importu, jeśli nie:

 import android.os.Vibrator;

Upewnij się, że jest to czynność, w której ma wystąpić wibracja.

Jak wibrować przez określony czas

W większości przypadków będziesz chciał wibrować urządzenie przez krótki, z góry określony czas. Możesz to osiągnąć za pomocą vibrate(long milliseconds)metody. Oto szybki przykład:

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

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

To wszystko, proste!

Jak wibrować w nieskończoność

Może się zdarzyć, że chcesz, aby urządzenie nadal wibrowało bez końca. W tym celu używamy vibrate(long[] pattern, int repeat)metody:

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

Kiedy jesteś gotowy, aby zatrzymać wibracje, po prostu wywołaj cancel()metodę:

v.cancel();

Jak używać wzorów wibracji

Jeśli chcesz uzyskać bardziej dostosowane wibracje, możesz spróbować stworzyć własne wzorce wibracji:

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

Bardziej złożone wibracje

Istnieje wiele zestawów SDK, które oferują bardziej wszechstronny zakres dotykowych informacji zwrotnych. Jednym z nich, którego używam do efektów specjalnych, jest Haptic Development Platform Immersion na Androida .

Rozwiązywanie problemów

Jeśli urządzenie nie wibruje, najpierw upewnij się, że może wibrować:

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

Po drugie, upewnij się, że dałeś swojej aplikacji pozwolenie na wibrowanie! Wróć do pierwszego punktu.


26
Znakomita odpowiedź, chociaż bałem się grać wibracje w nieskończoność. Podczas korzystania z tej funkcji prosimy o odpowiedzialność!
Dave

4
Świetna odpowiedź, ale jedno. Kiedy mówisz, że „0” oznacza tutaj powtarzanie w nieskończoność ”, chociaż prawda, jest nieco mylące. Liczba ta jest indeksem tablicy wzorców, od której wzorzec zacznie się podczas powtarzania.
aaronvargas

1
@aaronvargas Uczciwy punkt, choć nie jest to zakres tego, co większość ludzi stara się osiągnąć. Poszedłem na proste wyjaśnienie :)
Liam George Betsworth

@Liam George Betsworth Jak wibrować, nawet jeśli telefon jest w trybie cichym? Proszę.
Parthi,

1
Link do immersji jest wyłączony i nie mogę go znaleźć na archive.org :(
looper

73

Metoda aktualizacji wibracji (interwał) aktualizacji 2017 jest przestarzała w przypadku Androida-O (API 8.0)

Aby obsłużyć wszystkie wersje Androida, użyj tej metody.

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

2
Nie potrzebujemy pozwolenia środowiska wykonawczego na wibracje. Wibracja nie jest niebezpiecznym pozwoleniem, dlatego musi być zadeklarowana tylko w manifeście. [ developer.android.com/guide/topics/permissions/…
Roon13

Przeniesiono dokumentację @BugsHappen. Zaktualizuje go lub usunie.
Roon13

Jedyną rzeczą, którą chciałbym dodać, że jeśli używasz to w działaniu i nie mają zmienną określonym kontekście, a następnie zastąpić getSystemServicezthis.getContext().getSystemService
DrMcCleod

Pan zasłużył sobie na poparcie tej nazwy funkcji, touché
Starwave

18

Powyższe odpowiedzi są idealne. Chciałem jednak wibrować moją aplikację dokładnie dwa razy po kliknięciu przycisku i brakuje tutaj tych drobnych informacji, dlatego zamieszczam posty dla przyszłych czytelników takich jak ja. :)

Musimy postępować, jak wspomniano powyżej, a jedyną zmianą będzie wzór wibracji, jak poniżej,

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

To dokładnie wibruje dwa razy . Jak już wiemy

  1. 0 oznacza opóźnienie
  2. 100 mówi wibrować dla 100ms po raz pierwszy
  3. następnie przychodzi opóźnienie 1000 ms
  4. i opublikuj wibracje ponownie przez 300 ms

Można mówić naprzemiennie o opóźnieniu i wibracjach (np. 0, 100, 1000, 300, 1000, 300 dla 3 wibracji itd.), Ale pamiętaj, że słowo @ Dave'a używa go odpowiedzialnie. :)

Zauważ też, że parametr powtarzania jest ustawiony na -1, co oznacza, że ​​wibracje będą występować dokładnie tak , jak wspomniano we wzorze . :)


Dlaczego -1 oznacza, że ​​wibracje wystąpią dokładnie tak, jak wspomniano we wzorze? Dzięki!
Ruchir Baronia

@Rich Proszę odnieść się do mojej odpowiedzi. „-1” jest indeksem, od którego wibracja będzie próbowała się powtarzać po pierwszym zastosowaniu wzoru. „-1” jest poza zakresem, dlatego wibracja się nie powtarza.
Liam George Betsworth,

@Rich - Liam George Betsworth ma rację. Dokumenty Androida mówią - Aby powtórzyć wzorzec, przekaż indeks do tablicy wzorców, od której chcesz rozpocząć powtarzanie, lub -1, aby wyłączyć powtarzanie. Link - developer.android.com/reference/android/os/… , int)
Atul O Holic

14

Podczas pierwszego wdrożenia miałem problem ze zrozumieniem, jak to zrobić - upewnij się, że masz następujące elementy:

1) Twoje urządzenie obsługuje wibracje (mój tablet Samsung nie działał, więc ciągle sprawdzałem kod - oryginalny kod działał idealnie na moim CM Touchpad

2) W pliku AndroidManifest.xml zadeklarowałeś powyżej poziomu aplikacji, aby dać kodowi pozwolenie na uruchomienie.

3) Zaimportowałem oba poniższe elementy do MainActivity.java wraz z innymi importami: import android.content.Context; import android.os.Vibrator;

4) Wywołaj swoją wibrację (już obszernie omówione w tym wątku) - Zrobiłem to w osobnej funkcji i wywołaj to w kodzie w innych punktach - w zależności od tego, czego chcesz użyć do wywołania wibracji, możesz potrzebować obrazu ( Android: długie kliknięcie przycisku -> wykonywanie akcji ) lub detektora przycisku lub klikalnego obiektu zdefiniowanego w XML (klikalny obraz - Android ):

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

10

Wibracje bez użycia uprawnień

Jeśli chcesz po prostu wibrować urządzenie raz, aby przekazać opinię na temat działania użytkownika. Możesz użyć performHapticFeedback()funkcji View. Nie wymaga to VIBRATEzgody na zadeklarowanie w manifeście.

Użyj następującej funkcji jako funkcji najwyższego poziomu w niektórych popularnych klasach, takich jak Utils.kt twojego projektu:

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

A następnie użyj go w dowolnym miejscu Fragmentlub Activityw następujący sposób:

vibrate(requireView())

Proste!


2
Dobre i proste rozwiązanie!
VAdaihiep

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

należy dodać wewnątrz <manifest>tagu i <application>tagu zewnętrznego .


4

Używam następującej metody utils:

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

Dodaj następujące uprawnienie do pliku AndroidManifest

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

Możesz użyć przeciążonych metod w przypadku, gdy chcesz użyć różnych rodzajów wibracji (wzorów / nieokreślonych), jak sugerowano powyżej.


4

Powyższa odpowiedź jest bardzo poprawna, ale daję łatwy krok, aby to zrobić:

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

A następnie w pliku xml:

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

To najłatwiejszy sposób.


3

Wibrowanie we wzorach / falach :

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

Plus

Niezbędne pozwolenie w AndroidManifest.xml:

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

3

Aktualizacja Kotlin dla większego bezpieczeństwa typu

Użyj go jako funkcji najwyższego poziomu w niektórych popularnych klasach swojego projektu, takich jak 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)
        }
    }
}

A następnie wywołaj go w dowolnym miejscu kodu:

vibrateDevice(requireContext())

Wyjaśnienie

Korzystanie Vibrator::class.javajest bardziej bezpieczne dla typu niż używanieString stałych.

Sprawdzamy vibratorzerowalność za pomocą let { }, ponieważ jeśli wibracja nie jest dostępna dla urządzenia, vibratorbędzie null.

Można ukryć deprecjację w else klauzule, ponieważ ostrzeżenie pochodzi z nowszego SDK.

W czasie wykonywania nie musimy prosić o zgodę na używanie wibracji. Ale musimy to zadeklarować w AndroidManifest.xmlnastępujący sposób:

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

2

Użyj tego:

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

Uwaga:

Nie zapomnij dołączyć uprawnienia do pliku AndroidManifest.xml:

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

1

Możesz wibrować urządzenie i jego działanie

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

Zezwolenie jest konieczne, ale nie wymaga zezwolenia

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

to rozwiązanie jest przestarzałe
BekaBot
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.