Як зробити так, щоб пристрій Android вібрував?


499

Я написав додаток для Android. Тепер я хочу зробити пристрій вібрувати, коли відбувається певна дія. Як я можу це зробити?

Відповіді:


987

Спробуйте:

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
Чи є спосіб скасувати вібрацію всього телефону? Дякую!
Хаві

14
@joshsvoss Це 500 мілісекунд, це лише півсекунди. Перегляньте документи Google. developer.android.com/reference/android/os/Vibrator.html
cjayem13

5
це дає мені: контекст неможливо вирішити чи це не поле ..?! в чому проблема
Маклан

3
вібрація тепер застаріла. Використовуйте замість цього рішення Hitesh Sahu.
Рей Лі

2
Цей метод був застарілий на рівні 26 API vibrate(VibrationEffect).
Тімо Бер

651

Надати дозвіл на вібрацію

Перш ніж почати впроваджувати будь-який вібраційний код, ви повинні надати додатку дозвіл на вібрацію:

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

Обов’язково включіть цей рядок у файл AndroidManifest.xml.

Імпортуйте бібліотеку вібрацій

Більшість IDE зроблять це за вас, але ось імпорт заяви, якщо ваш:

 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, які пропонують більш повний спектр швидких зворотних зв'язків. Я використовую для спеціальних ефектів платформу Haptic Development 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

1
@aaronvargas Справедливий момент, хоча це виходить за рамки того, що намагається досягти більшість людей. Я пішов на просте пояснення :)
Ліам Джордж Бетсворт

@Liam Джордж Бетсворт Як я можу вібрувати навіть мобільний телефон у беззвучному режимі? будь ласка.
Парті

1
Посилання занурення перервано, і я не можу його знайти на archive.org :(
looper

73

Метод оновлення вібрації (інтервал) 2017 застарілий за допомогою Android-O (API 8.0)

Для підтримки всіх версій 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

Єдине, що я хотів би додати, це те, що якщо ви використовуєте це в діяльності та не маєте певної змінної контексту, замініть getSystemServiceнаthis.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. наступна затримка 1000мс
  4. і повідомлення, яке знову вібрує протягом 300 мс

Можна продовжувати згадувати про затримку та вібрацію (наприклад, 0, 100, 1000, 300, 1000, 300 для 3 коливань тощо), але пам’ятайте, що слово @ Дейва використовує це відповідально. :)

Тут також зауважте, що параметр повтору встановлено на -1, а це означає, що вібрація відбуватиметься точно так, як зазначено в малюнку . :)


Чому -1 означає, що вібрація буде відбуватися саме так, як зазначено в схемі? Дякую!
Ruchir Baronia

@Rich Будь ласка, зверніться до моєї відповіді. '-1' - це показник, з якого вібрація буде намагатися повторитись після наступного шаблону вперше. '-1' знаходиться поза межами, тому вібрація не повторюється.
Ліам Джордж Бетсворт

@Rich - Ліам Джордж Бетсворт правильний. Документи Android говорять - Щоб змусити повторити шаблон, перенесіть індекс у масив шаблонів, з якого можна розпочати повтор, або -1, щоб відключити повторення. Посилання - developer.android.com/reference/android/os/… , int)
Atul O Holic

14

Я намагався зрозуміти, як це зробити під час моєї першої реалізації - переконайтеся, що у вас є наступне:

1) Ваш пристрій підтримує вібрацію (мій планшет Samsung не працював, тому я постійно перевіряв код - оригінальний код відмінно працював на моєму сенсорній панелі CM

2) Ви оголосили вище рівня програми у вашому файлі AndroidManifest.xml, щоб дати дозволу на запуск коду.

3) Імпортували обидва з них у ваш MainActivity.java разом з іншими імпортами: import android.content.Context; імпортувати android.os.Vibrator;

4) Зателефонуйте на свою вібрацію (вже досить широко обговорюється в цій темі) - я зробив це в окрему функцію і називаю це в коді в інших точках - залежно від того, що ви хочете використовувати для виклику вібрації, вам може знадобитися зображення ( Android: тривалим натисканням на кнопку -> виконувати дії ) або слухачем кнопок, або об'єктом, що можна натиснути, як визначено в XML ( зображення, що натискає - android ):

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

10

Вібрація без використання дозволу

Якщо ви хочете один раз вібрувати пристрій, щоб надати зворотний зв’язок про дії користувача. Ви можете використовувати performHapticFeedback()функцію a 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)
}

А потім використовуйте його будь-де у своєму Fragmentабо Activityнаступному:

vibrate(requireView())

Просто як це!


2
Гарне і просте рішення!
VAdaihiep

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

слід додати всередині <manifest>тегу та зовнішнього <application>тегу.


4

Я використовую наступний метод утиліти:

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.