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.