Bir Android cihazı nasıl titreştiririm?


Yanıtlar:


987

Deneyin:

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

Not:

AndroidManifest.xml dosyasına izin eklemeyi unutmayın:

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

3
Tüm telefonun titreşimini iptal etmenin bir yolu var mı? Teşekkürler!
— Javi

14
@joshsvoss Sadece yarım saniye olan 500 milisaniye. Google dokümanlarına göz atın. developer.android.com/reference/android/os/Vibrator.html
— cjayem13

5
bana veriyor: bağlam çözülemiyor ya da bir alan değil ..?! sorun nedir
— McLan

3
titreşim artık kullanılmıyor. Bunun yerine Hitesh Sahu'nun çözümünü kullanın.
— Ray Li

2
Bu yöntem API 26 düzeyinde kullanımdan kaldırılmıştır vibrate(VibrationEffect). Bunun yerine kullanın .
— Timo Bähr

651

Titreşim İzni Ver

Herhangi bir titreşim kodu uygulamaya başlamadan önce, uygulamanıza titreşim izni vermelisiniz:

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

Bu satırı AndroidManifest.xml dosyanıza eklediğinizden emin olun.

Titreşim Kitaplığını İçe Aktar

Çoğu IDE bunu sizin için yapacak, ancak işiniz yapmadıysa içe aktarma ifadesi:

 import android.os.Vibrator;

Titreşimin olmasını istediğiniz etkinlikte bunun olduğundan emin olun.

Belirli Bir Süre Nasıl Titreşilir

Çoğu durumda, cihazı kısa, önceden belirlenmiş bir süre titreştirmek istersiniz. Bunu vibrate(long milliseconds)yöntemi kullanarak başarabilirsiniz . İşte kısa bir örnek:

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

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

Hepsi bu kadar basit!

Süresiz Titreşim

Cihazın süresiz olarak titreşmeye devam etmesini isteyebilirsiniz. Bunun için vibrate(long[] pattern, int repeat)yöntemi kullanıyoruz:

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

Titreşimi durdurmaya hazır olduğunuzda, sadece cancel()yöntemi çağırın :

v.cancel();

Titreşim Kalıpları nasıl kullanılır

Daha fazla ısmarlama titreşim istiyorsanız, kendi titreşim desenlerinizi oluşturmayı deneyebilirsiniz:

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

Daha Karmaşık Titreşimler

Daha kapsamlı bir dokunsal geri bildirim yelpazesi sunan birden fazla SDK vardır. Özel efektler için kullandığım, Immersion'un Android için Haptik Geliştirme Platformu .

Sorun giderme

Cihazınız titreşmezse, önce titreşebildiğinden emin olun:

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

İkinci olarak, lütfen uygulamanıza titreşim izni verdiğinizden emin olun! İlk noktaya geri dönün.


26
Mükemmel cevap, süresiz bir titreşim oynamaya karşı dikkatli olmama rağmen. Bu özelliği kullanırken lütfen sorumlu olun!
— Dave

4
Harika cevap, ama bir şey. 'Buradaki' 0 'derken, süresiz olarak tekrar etmek anlamına gelir', doğru olmasına rağmen, biraz yanıltıcıdır. Bu sayı, yineleme sırasında desenin başlayacağı desen dizisinin dizinidir.
— aaronvargas

1
@aaronvargas Adil nokta, ancak çoğu insanın başarmaya çalıştığı kapsamın dışında. Basit bir açıklama için gittim :)
— Liam George Betsworth

@Liam George Betsworth Cep telefonu sessiz modda bile nasıl titreştiririm? Lütfen.
— Parthi

1
Daldırma bağlantısı kesildi ve bunu archive.org'da bulamıyorum :(
— lüper

73

Güncelleme 2017 titreşim (aralık) yöntemi Android-O (API 8.0) ile kullanımdan kaldırıldı

Tüm Android sürümlerini desteklemek için bu yöntemi kullanın.

// 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
Titreşim için çalışma zamanı iznine ihtiyacımız yok. Titreşim tehlikeli bir izin değildir, bu yüzden sadece manifestte beyan edilmelidir. [ developer.android.com/guide/topics/permissions/…
— Roon13

@BugsHappen belgeleri taşındı. Günceller veya siler.
— Roon13

Ekleyeceğim tek şey, bunu bir Etkinlikte kullanıyorsanız ve belirli bir Bağlam değişkenine getSystemServicesahip this.getContext().getSystemService
— değilseniz

efendim, bu fonksiyon isminden dolayı bir oy aldı, touché
— Starwave

18

Yukarıdaki cevaplar mükemmel. Ancak düğme tıklamasıyla uygulamamı tam olarak iki kez titreştirmek istedim ve bu küçük bilgi burada eksik, bu yüzden benim gibi gelecekteki okuyucular için gönderiyor. :)

Yukarıda belirtildiği gibi takip etmeliyiz ve tek değişiklik aşağıdaki gibi titreşim düzeninde olacaktır,

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

Bu tam olarak iki kez titreşir . Bildiğimiz gibi

  1. 0 gecikme içindir
  2. 100 ilk kez 100 ms titreşti diyor
  3. sonraki 1000 ms gecikme geliyor
  4. ve titreşimi tekrar 300ms

Alternatif olarak gecikme ve titreşimden söz edilebilir (örneğin, 3 titreşim için 0, 100, 1000, 300, 1000, 300 vb.) Ama @ Dave'in sözünü bunu sorumlu bir şekilde kullandığını unutmayın. :)

Ayrıca burada tekrar parametresinin -1 olarak ayarlandığını unutmayın , bu da titreşimin aynen desende belirtildiği gibi gerçekleşeceği anlamına gelir . :)


-1 neden titreşimin tam olarak desende belirtildiği gibi olacağı anlamına gelir? Teşekkürler!
— Ruchir Baronia

@Rich Lütfen cevabıma bakınız. '-1', paterni ilk kez izledikten sonra titreşimin tekrarlamaya çalışacağı endekstir. '-1' sınırların dışında olduğundan titreşim tekrarlanmıyor.
— Liam George Betsworth

@Rich - Liam George Betsworth doğru. Android dokümanları - Desenin tekrarlanmasına neden olmak için, dizini tekrarın başlatılacağı desen dizisine veya tekrarlamayı devre dışı bırakmak için -1'e iletin. Bağlantı - developer.android.com/reference/android/os/… , int)
— Atul O Holic

14

İlk uygulamamda bunu nasıl yapacağımı anlamaya çalıştım - aşağıdakilere sahip olduğunuzdan emin olun:

1) Cihazınız titreşimi destekliyor (Samsung tabletim çalışmadı, bu yüzden kodu tekrar kontrol ettim - orijinal kod CM Touchpad'imde mükemmel çalıştı

2) Kodun çalışmasına izin vermek için AndroidManifest.xml dosyanızdaki uygulama düzeyinin üzerinde beyan ettiniz.

3) Aşağıdakilerin ikisini de diğer ithalatlarla MainActivity.java'nıza içe aktarın: import android.content.Context; ithalat android.os.Vibrator;

4) Titreşiminizi arayın (zaten bu iş parçacığında yoğun bir şekilde tartışılmıştır) - Ayrı bir işlevde yaptım ve bunu diğer noktalarda kod olarak çağırdım - titreşimi çağırmak için ne kullanmak istediğinize bağlı olarak bir görüntüye ihtiyacınız olabilir ( Android: bir düğmeye uzun tıklama -> eylemler gerçekleştirme ) veya düğme dinleyici veya XML'de tanımlandığı şekilde tıklanabilir bir nesne ( Tıklanabilir görüntü - android ):

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

10

İzin kullanmadan titret

Bir kullanıcı işlemi hakkında geri bildirim sağlamak için cihazı bir kez titreştirmek istiyorsanız. A performHapticFeedback()işlevini kullanabilirsiniz View. Bunun VIBRATEbildirimde bildirilmek için izne ihtiyacı yoktur .

Aşağıdaki işlevi, projenizin Utils.kt gibi bazı ortak sınıflarda üst düzey işlev olarak kullanın:

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

Ve sonra, herhangi bir yerde Fragmentveya Activityaşağıdaki gibi kullanın :

vibrate(requireView())

Bu kadar basit!


2
İyi ve basit bir çözüm!
— VAdaihiep

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

<manifest>etiketin içine ve dış <application>etikete eklenmelidir .


4

Aşağıdaki utils yöntemini kullanın:

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

AndroidManifest dosyasına aşağıdaki izni ekleyin

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

Yukarıda önerildiği gibi farklı titreşim türleri (desenler / belirsiz) kullanmak istiyorsanız aşırı yüklenmiş yöntemleri kullanabilirsiniz.


4

Yukarıdaki cevap çok doğru ama bunu yapmak için kolay bir adım atıyorum:

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

Ve sonra xml dosyanızda:

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

Bu en kolay yol.


3

Kalıplarda / Dalgalarda Titreşim :

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

Artı

Gerekli izin AndroidManifest.xml:

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

3

Daha fazla güvenlik için Kotlin güncellemesi

Utils.kt gibi projenizin bazı ortak sınıflarında üst düzey işlev olarak kullanın

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

Ve kodunuzdaki herhangi bir yeri aşağıdaki gibi arayın:

vibrateDevice(requireContext())

açıklama

Kullanmak sabitleri kullanmaktan Vibrator::class.javadaha güvenlidir String.

vibratorKullanarak nullabilite kontrol ediyoruz let { }, çünkü cihaz için titreşim mevcut değilse, vibratorolacaktır null.

elseUyarı yeni SDK'dan geldiğinden, cümledeki kullanımdan kaldırmayı bastırmak uygun .

Titreşim kullanmak için çalışma zamanında izin istememiz gerekmez. Ancak bunu AndroidManifest.xmlaşağıdaki gibi beyan etmeliyiz :

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

2

Bunu kullan:

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

Not:

AndroidManifest.xml dosyasına izin eklemeyi unutmayın:

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

1

Cihazı ve çalışmasını Titreşebilirsiniz

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

İzin gerekli, ancak çalışma zamanında izin gerekli değil

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

bu çözüm kullanımdan kaldırıldı
— BekaBot
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.