Bagaimana cara membuat perangkat Android bergetar?

499

Saya menulis aplikasi Android. Sekarang, saya ingin membuat perangkat bergetar ketika tindakan tertentu terjadi. Bagaimana saya bisa melakukan ini?

Billie
sumber

Jawaban:

988

Mencoba:

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

catatan:

Jangan lupa untuk menyertakan izin dalam file AndroidManifest.xml:

<uses-permission android:name="android.permission.VIBRATE"/>
Paresh Mayani
sumber
3
Apakah ada cara untuk membatalkan getaran semua telepon? Terima kasih!
Javi
14
@ joshsvoss Ini 500 milidetik yang hanya setengah detik. Lihat google docs. developer.android.com/reference/android/os/Vibrator.html
cjayem13
5
itu memberi saya: konteks tidak dapat diselesaikan atau bukan bidang ..?! apa masalahnya
McLan
3
getar sekarang sudah tidak digunakan lagi. Gunakan solusi oleh Hitesh Sahu sebagai gantinya.
Ray Li
2
Metode ini sudah tidak digunakan lagi di API level 26. Gunakan vibrate(VibrationEffect)saja.
Timo Bähr
651

Berikan Izin Getaran

Sebelum Anda mulai menerapkan kode getaran apa pun, Anda harus memberi izin pada aplikasi Anda untuk bergetar:

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

Pastikan untuk memasukkan baris ini dalam file AndroidManifest.xml Anda.

Impor Perpustakaan Getaran

Sebagian besar IDE akan melakukan ini untuk Anda, tetapi ini adalah pernyataan impor jika Anda tidak:

 import android.os.Vibrator;

Pastikan ini dalam aktivitas di mana Anda ingin getaran terjadi.

Cara Bergetar untuk Waktu yang Diberikan

Dalam sebagian besar keadaan, Anda ingin menggetarkan perangkat untuk waktu yang singkat dan telah ditentukan sebelumnya. Anda dapat mencapai ini dengan menggunakan vibrate(long milliseconds)metode ini. Ini adalah contoh cepat:

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

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

Itu dia, sederhana!

Cara Bergetar tanpa batas

Mungkin Anda ingin perangkat terus bergetar tanpa batas. Untuk ini, kami menggunakan vibrate(long[] pattern, int repeat)metode:

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

Saat Anda siap untuk menghentikan getaran, panggil saja cancel()metode ini:

v.cancel();

Cara menggunakan Pola Getaran

Jika Anda menginginkan getaran yang lebih khusus, Anda dapat mencoba membuat pola getaran sendiri:

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

Getaran Lebih Kompleks

Ada beberapa SDK yang menawarkan rentang umpan balik haptic yang lebih komprehensif. Salah satu yang saya gunakan untuk efek khusus adalah Platform Haptic Development Immersion untuk Android .

Penyelesaian masalah

Jika perangkat Anda tidak bergetar, pertama-tama pastikan itu dapat bergetar:

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

Kedua, harap pastikan bahwa Anda memberi izin pada aplikasi Anda untuk bergetar! Rujuk kembali ke poin pertama.

Liam George Betsworth
sumber
26
Jawaban yang sangat bagus, meskipun saya akan berhati-hati memainkan getaran tanpa batas. Harap bertanggung jawab saat menggunakan fitur ini!
Dave
4
Jawaban yang bagus, tetapi satu hal. Ketika Anda mengatakan 'The' 0 'di sini berarti mengulang tanpa batas', meskipun benar, agak menyesatkan. Angka ini adalah Indeks array pola yang akan dimulai pola ketika mengulangi.
aaronvargas
1
@ aaronvargas Fair point, meskipun itu di luar ruang lingkup apa yang kebanyakan orang coba capai. Saya pergi untuk penjelasan sederhana :)
Liam George Betsworth
@Liam George Betsworth Bagaimana cara saya bergetar bahkan ponsel dalam mode hening? silahkan.
Parthi
1
Link perendaman sedang down dan saya tidak dapat menemukannya di archive.org :(
looper
73

Metode pembaruan 2017 vibrate (interval) sudah tidak digunakan lagi dengan Android-O (API 8.0)

Untuk mendukung semua versi Android gunakan metode ini.

// 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)
    }
}
Hitesh Sahu
sumber
2
Kami tidak memerlukan izin runtime untuk Getaran. Getaran bukan izin berbahaya, jadi itu hanya harus dinyatakan dalam manifes. [ developer.android.com/guide/topics/permissions/…
Roon13
Dokumentasi @BugsHappen dipindahkan. Akan memperbarui atau menghapusnya.
Roon13
Satu-satunya hal yang akan saya tambahkan adalah bahwa jika Anda menggunakan ini dalam suatu Kegiatan dan tidak memiliki variabel Konteks tertentu, kemudian ganti getSystemServicedenganthis.getContext().getSystemService
DrMcCleod
Anda Tuan mendapat upvote karena nama fungsi itu, sentuh
Starwave
18

Jawaban di atas sempurna. Namun saya ingin menggetarkan aplikasi saya persis dua kali pada klik tombol dan informasi kecil ini tidak ada di sini, karenanya memposting untuk pembaca masa depan seperti saya. :)

Kita harus mengikuti seperti yang disebutkan di atas dan satu-satunya perubahan akan berada dalam pola bergetar seperti di bawah ini,

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

Ini akan bergetar dua kali . Seperti yang sudah kita ketahui

  1. 0 untuk penundaan
  2. 100 mengatakan getar untuk 100 ms untuk pertama kalinya
  3. selanjutnya datang keterlambatan 1000ms
  4. dan posting yang bergetar lagi selama 300 ms

Seseorang dapat terus-menerus menyebutkan penundaan dan getaran sebagai alternatif (mis. 0, 100, 1000, 300, 1000, 300 untuk 3 getaran dan seterusnya ..) tetapi ingatlah kata @ Dave yang menggunakannya secara bertanggung jawab. :)

Perhatikan juga di sini bahwa parameter pengulangan diatur ke -1 yang berarti getaran akan terjadi persis seperti yang disebutkan dalam pola . :)

Atul O Holic
sumber
Mengapa -1 berarti getaran akan terjadi persis seperti yang disebutkan dalam pola? Terima kasih!
Ruchir Baronia
@Rich Silakan lihat jawaban saya. '-1' adalah indeks di mana getaran akan mencoba untuk mengulangi, setelah mengikuti pola untuk pertama kalinya. '-1' di luar batas, oleh karena itu getarannya tidak berulang.
Liam George Betsworth
@ Rich - Liam George Betsworth benar. Android docs say - Untuk menyebabkan pola berulang, masukkan indeks ke dalam array pola untuk memulai pengulangan, atau -1 untuk menonaktifkan pengulangan. Tautan - developer.android.com/reference/android/os/… , int)
Atul O Holic
14

Saya kesulitan memahami bagaimana melakukan ini pada implementasi pertama saya - pastikan Anda memiliki yang berikut:

1) Perangkat Anda mendukung getaran (tablet Samsung saya tidak berfungsi sehingga saya terus memeriksa ulang kodenya - kode asli berfungsi dengan baik pada CM Touchpad saya

2) Anda telah mendeklarasikan di atas level aplikasi dalam file AndroidManifest.xml Anda untuk memberikan izin kode untuk dijalankan.

3) Telah mengimpor kedua hal berikut ke MainActivity.java Anda dengan impor lainnya: impor android.content.Context; impor android.os.Vibrator;

4) Panggil getaran Anda (sudah dibahas secara luas di utas ini sudah) - Saya melakukannya di fungsi terpisah dan menyebutnya dalam kode di titik lain - tergantung pada apa yang ingin Anda gunakan untuk memanggil getaran Anda mungkin memerlukan gambar ( Android: klik panjang pada tombol -> lakukan tindakan ) atau pendengar tombol, atau objek yang dapat diklik seperti yang didefinisikan dalam XML ( gambar yang dapat diklik - android ):

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

Bergetar tanpa menggunakan izin

Jika Anda ingin hanya bergetar perangkat sekali untuk memberikan umpan balik pada tindakan pengguna. Anda dapat menggunakan performHapticFeedback()fungsi a View. Ini tidak perlu VIBRATEizin untuk dinyatakan dalam manifes.

Gunakan fungsi berikut sebagai fungsi tingkat atas di beberapa kelas umum seperti Utils.kt dari proyek Anda:

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

Dan kemudian gunakan di mana saja di Anda Fragmentatau Activitysebagai berikut:

vibrate(requireView())

Sederhana seperti itu!

Yogesh Umesh Vaity
sumber
2
Solusi yang bagus dan sederhana!
VAdaihiep
5
<uses-permission android:name="android.permission.VIBRATE"/>

harus ditambahkan <manifest>tag di dalam dan di luar <application>tag.

Sivagami Nambi
sumber
4

Saya menggunakan metode utils berikut:

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

Tambahkan izin berikut ke file AndroidManifest

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

Anda dapat menggunakan metode kelebihan beban jika Anda ingin menggunakan berbagai jenis getaran (pola / tidak terbatas) seperti yang disarankan di atas.

Mahendra Liya
sumber
4

Jawaban di atas sangat benar tetapi saya memberikan langkah mudah untuk melakukannya:

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

Dan kemudian di file xml Anda:

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

Itu cara termudah .

dondondon
sumber
3

Pola / Gelombang yang bergetar :

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

Izin yang diperlukan di AndroidManifest.xml:

<uses-permission android:name="android.permission.VIBRATE"/>
Maksim Ivanov
sumber
3

Pembaruan Kotlin untuk keamanan tipe yang lebih banyak

Gunakan itu sebagai fungsi tingkat atas di beberapa kelas umum proyek Anda seperti 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)
        }
    }
}

Dan menyebutnya di mana saja dalam kode Anda sebagai berikut:

vibrateDevice(requireContext())

Penjelasan

Menggunakan Vibrator::class.javalebih aman daripada menggunakan Stringkonstanta.

Kami memeriksa vibratornullability menggunakan let { }, karena jika getaran tidak tersedia untuk perangkat, itu vibratorakan menjadi null.

Tidak masalah untuk menekan penghentian elseklausa, karena peringatan tersebut dari SDK yang lebih baru.

Kami tidak perlu meminta izin saat runtime untuk menggunakan getaran. Tetapi kita perlu mendeklarasikannya AndroidManifest.xmlsebagai berikut:

<uses-permission android:name="android.permission.VIBRATE"/>
Yogesh Umesh Vaity
sumber
2

Gunakan ini:

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

catatan:

Jangan lupa untuk menyertakan izin dalam file AndroidManifest.xml:

<uses-permission android:name="android.permission.VIBRATE"/>
Prakhar Gupta
sumber
1

Anda dapat Getar Perangkat dan pekerjaannya

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

Izin diperlukan tetapi tidak pada izin runtime diperlukan

<uses-permission android:name="android.permission.VIBRATE"/>
Ahmad
sumber
solusi ini sudah usang
BekaBot