วิธีทำให้อุปกรณ์ 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
มีวิธีการยกเลิกการสั่นสะเทือนของโทรศัพท์ทั้งหมดหรือไม่ ขอบคุณ!
Javi

14
@ Joshsvoss เป็น 500 มิลลิวินาทีซึ่งใช้เวลาเพียงครึ่งวินาที ลองใช้ Google เอกสาร developer.android.com/reference/android/os/Vibrator.html
cjayem13

5
มันทำให้ฉัน: บริบทไม่สามารถแก้ไขได้หรือไม่ใช่ฟิลด์ .. ?! ปัญหาคืออะไร
McLan

3
การสั่นสะเทือนเลิกใช้แล้ว ใช้วิธีแก้ปัญหาโดย Hitesh Sahu แทน
Ray Li

2
วิธีนี้เลิกใช้แล้วใน API ระดับ 26 ใช้vibrate(VibrationEffect)แทน
Timo Bähr

651

การอนุญาตให้มีการสั่นสะเทือน

ก่อนที่คุณจะเริ่มใช้งานโค้ดการสั่นสะเทือนใด ๆ คุณต้องให้สิทธิ์แก่แอปพลิเคชันในการสั่นของคุณ

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

ตรวจสอบให้แน่ใจว่าได้รวมบรรทัดนี้ในไฟล์ AndroidManifest.xml ของคุณ

นำเข้าห้องสมุดการสั่นสะเทือน

IDEs ส่วนใหญ่จะทำสิ่งนี้ให้คุณ แต่นี่คือคำสั่งการนำเข้าหากคุณไม่ได้:

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

วิธีการใช้รูปแบบการสั่นสะเทือน

หากคุณต้องการการสั่นสะเทือนแบบ bespoke คุณสามารถลองสร้างรูปแบบการสั่นสะเทือนของคุณเองได้:

// 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 แช่สำหรับ 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 จุดยุติธรรมถึงแม้ว่าจะอยู่นอกขอบเขตของสิ่งที่คนส่วนใหญ่พยายามที่จะบรรลุ ฉันไปสำหรับคำอธิบายง่ายๆ :)
เลียมจอร์จ Betsworth

@Liam George Betsworth ฉันจะสั่นได้อย่างไรแม้มือถือจะอยู่ในโหมดเงียบ โปรด.
Parthi

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

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
เราไม่ต้องการสิทธิ์รันไทม์สำหรับการสั่นสะเทือน การสั่นสะเทือนไม่ได้รับอนุญาตที่เป็นอันตรายดังนั้นจะต้องมีการประกาศในรายการเท่านั้น [ developer.android.com/guide/topics/permissions/…
Roon13

ย้ายเอกสาร @BugsHappen แล้ว จะอัปเดตหรือลบทิ้ง
Roon13

สิ่งเดียวที่ฉันจะเพิ่มคือถ้าคุณใช้สิ่งนี้ในกิจกรรมและไม่มีตัวแปรบริบทเฉพาะจากนั้นแทนที่getSystemServiceด้วยthis.getContext().getSystemService
DrMcCleod

คุณคุณสมควรได้รับสาเหตุ 'ของชื่อฟังก์ชั่นที่สัมผัส
Starwave

18

คำตอบข้างต้นนั้นสมบูรณ์แบบ อย่างไรก็ตามฉันต้องการที่จะสั่นแอพของฉันสองครั้งเมื่อคลิกปุ่มและข้อมูลเล็ก ๆ นี้หายไปที่นี่จึงโพสต์สำหรับผู้อ่านในอนาคตเช่นฉัน :)

เราต้องปฏิบัติตามที่กล่าวไว้ข้างต้นและการเปลี่ยนแปลงเพียงอย่างเดียวจะอยู่ในรูปแบบการสั่นดังนี้

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

สิ่งนี้จะสั่นสะเทือนสองครั้งอย่างแน่นอน อย่างที่เรารู้อยู่แล้ว

  1. 0 สำหรับความล่าช้า
  2. 100 พูดว่าสั่นเป็นเวลา 100 มิลลิวินาทีเป็นครั้งแรก
  3. ถัดมาล่าช้า 1000ms
  4. และโพสต์ที่สั่นสะเทือนอีกครั้งสำหรับ 300ms

หนึ่งสามารถไปและกล่าวถึงความล่าช้าและการสั่นสะเทือนหรือ (เช่น 0, 100, 1,000, 300, 1000, 300 สำหรับ 3 การสั่นสะเทือนและอื่น ๆ .. ) แต่จำไว้ว่าคำ @ เดฟใช้มันอย่างรับผิดชอบ :)

นอกจากนี้ยังทราบว่าที่นี่ทำซ้ำพารามิเตอร์การตั้งค่าเพื่อ -1 ซึ่งหมายถึงการสั่นสะเทือนที่จะเกิดขึ้นตรงตามที่กล่าวไว้ในรูปแบบ :)


ทำไม -1 หมายถึงการสั่นสะเทือนจะเกิดขึ้นตรงตามที่ระบุไว้ในรูปแบบ? ขอบคุณ!
Ruchir Baronia

@ Rich โปรดดูคำตอบของฉัน '-1' คือดัชนีที่การสั่นจะพยายามทำซ้ำหลังจากทำตามรูปแบบเป็นครั้งแรก '-1' อยู่นอกขอบเขตดังนั้นการสั่นสะเทือนจะไม่เกิดซ้ำ
เลียมจอร์จเบตส์เวิร์ ธ

@Rich - Liam George Betsworth ถูกต้อง เอกสาร Android พูดว่า - หากต้องการให้รูปแบบซ้ำให้ส่งดัชนีไปยังอาร์เรย์รูปแบบที่จะเริ่มทำซ้ำหรือ -1 เพื่อปิดใช้งานการทำซ้ำ ลิงก์ - developer.android.com/reference/android/os/… , int)
Atul O Holic

14

ฉันพยายามทำความเข้าใจเกี่ยวกับวิธีการทำสิ่งนี้ในการติดตั้งครั้งแรกของฉัน - ตรวจสอบให้แน่ใจว่าคุณมีสิ่งต่อไปนี้:

1) อุปกรณ์ของคุณรองรับการสั่นสะเทือน (แท็บเล็ต Samsung ของฉันไม่ทำงานดังนั้นฉันจึงตรวจสอบรหัสอีกครั้ง - รหัสต้นฉบับทำงานได้อย่างสมบูรณ์บน CM Touchpad ของฉัน

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() 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


4

ฉันใช้วิธี utils ต่อไปนี้:

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สำหรับ nullability ใช้let { }เพราะถ้าการสั่นสะเทือนจะไม่สามารถใช้ได้สำหรับอุปกรณ์ที่จะได้รับvibratornull

มันก็โอเคที่จะปราบปรามการคัดค้านใน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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.