Làm thế nào để làm cho một thiết bị Android rung?


499

Tôi đã viết một ứng dụng Android. Bây giờ, tôi muốn làm cho thiết bị rung khi có một hành động nào đó xảy ra. Tôi có thể làm cái này như thế nào?

Câu trả lời:


988

Thử:

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

Ghi chú:

Đừng quên bao gồm quyền trong tệp AndroidManifest.xml:

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

3
Có cách nào để hủy rung động của tất cả các điện thoại? cảm ơn!
Javi

14
@joshsvoss Đó là 500 mili giây chỉ là nửa giây. Kiểm tra tài liệu google. developer.android.com/reference/android/os/Vibrator.html
cjayem13

5
nó cho tôi: bối cảnh không thể được giải quyết hoặc không phải là một lĩnh vực ..?! vấn đề là gì
McLan

3
rung bây giờ không được dùng nữa Sử dụng giải pháp của Hitesh Sahu thay thế.
Ray Li

2
Phương pháp này không được dùng trong API cấp 26. vibrate(VibrationEffect)Thay vào đó, hãy sử dụng .
Timo Bähr

651

Cấp phép rung

Trước khi bạn bắt đầu thực hiện bất kỳ mã rung động nào, bạn phải cấp cho ứng dụng của mình quyền rung:

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

Đảm bảo bao gồm dòng này trong tệp AndroidManifest.xml của bạn.

Nhập thư viện rung

Hầu hết các IDE sẽ làm điều này cho bạn, nhưng đây là câu lệnh nhập nếu bạn không:

 import android.os.Vibrator;

Hãy chắc chắn rằng điều này trong hoạt động mà bạn muốn rung động xảy ra.

Cách rung trong một thời gian nhất định

Trong hầu hết các trường hợp, bạn sẽ muốn rung thiết bị trong một khoảng thời gian ngắn, được xác định trước. Bạn có thể đạt được điều này bằng cách sử dụng vibrate(long milliseconds)phương pháp. Đây là một ví dụ nhanh:

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

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

Thế thôi, đơn giản!

Cách rung vô thời hạn

Nó có thể là trường hợp bạn muốn thiết bị tiếp tục rung vô thời hạn. Đối với điều này, chúng tôi sử dụng vibrate(long[] pattern, int repeat)phương pháp:

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

Khi bạn đã sẵn sàng để dừng rung, chỉ cần gọi cancel()phương thức:

v.cancel();

Cách sử dụng Kiểu rung

Nếu bạn muốn có độ rung bespoke nhiều hơn, bạn có thể thử tạo các kiểu rung của riêng mình:

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

Rung động phức tạp hơn

Có nhiều SDK cung cấp một phạm vi phản hồi xúc giác toàn diện hơn. Một ứng dụng mà tôi sử dụng cho các hiệu ứng đặc biệt là Nền tảng phát triển Haptic dành cho Android .

Xử lý sự cố

Nếu thiết bị của bạn không rung, trước tiên hãy đảm bảo rằng thiết bị có thể rung:

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

Thứ hai, hãy đảm bảo rằng bạn đã cấp cho ứng dụng của mình quyền rung! Tham khảo lại điểm đầu tiên.


26
Câu trả lời tuyệt vời, mặc dù tôi sẽ cảnh giác khi chơi rung động vô thời hạn. Hãy chịu trách nhiệm khi sử dụng tính năng này!
Dave

4
Câu trả lời tuyệt vời, nhưng một điều. Khi bạn nói '0' ở đây có nghĩa là lặp lại vô thời hạn ', mặc dù đúng, là một chút sai lệch. Số này là Chỉ mục của mảng mẫu mà mẫu sẽ bắt đầu khi lặp lại.
aaronvargas

1
@aaronvargas Điểm công bằng, mặc dù đó là ngoài phạm vi của hầu hết mọi người đang cố gắng đạt được. Tôi đã đi giải thích đơn giản :)
Liam George Betsworth

@Liam George Betsworth Làm thế nào để tôi rung ngay cả điện thoại di động ở chế độ im lặng? xin vui lòng.
Parthi

1
Liên kết nhúng đã ngừng hoạt động và tôi không thể tìm thấy nó trên archive.org :(
looper

73

Cập nhật phương pháp rung (khoảng thời gian) 2017 không được dùng nữa với Android-O (API 8.0)

Để hỗ trợ tất cả các phiên bản Android sử dụng phương pháp này.

// 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
Chúng tôi không cần sự cho phép thời gian chạy cho Rung. Rung không phải là một sự cho phép nguy hiểm, vì vậy nó chỉ phải được khai báo trong bảng kê khai. [ developer.android.com/guide/topics/permissions/ từ
Roon13

Tài liệu @BugsHappen di chuyển. Sẽ cập nhật hoặc xóa nó.
Roon13

Điều duy nhất tôi muốn thêm là nếu bạn đang sử dụng điều này trong Hoạt động và không có biến Bối cảnh cụ thể, thì hãy thay thế getSystemServicebằngthis.getContext().getSystemService
DrMcCleod

bạn đã kiếm được một nguyên nhân vì tên chức năng đó, touché
Starwave

18

Câu trả lời trên là hoàn hảo. Tuy nhiên, tôi muốn rung ứng dụng của mình chính xác hai lần khi nhấp vào nút và thông tin nhỏ này bị thiếu ở đây, do đó đăng cho những độc giả tương lai như tôi. :)

Chúng ta phải làm theo như đã đề cập ở trên và thay đổi duy nhất sẽ là trong mẫu rung như bên dưới,

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

Điều này chính xác sẽ rung hai lần . Như chúng ta đã biết

  1. 0 là sự chậm trễ
  2. 100 nói lần đầu tiên rung trong 100ms
  3. tiếp theo là độ trễ 1000ms
  4. và đăng lại rung động trong 300ms

Người ta có thể tiếp tục đề cập đến độ trễ và độ rung thay thế (ví dụ 0, 100, 1000, 300, 1000, 300 cho 3 rung động, v.v.) nhưng hãy nhớ từ của @ Dave sử dụng nó một cách có trách nhiệm. :)

Cũng lưu ý ở đây rằng tham số lặp lại được đặt thành -1, có nghĩa là rung sẽ xảy ra chính xác như được đề cập trong mẫu . :)


Tại sao -1 có nghĩa là rung động sẽ xảy ra chính xác như được đề cập trong mẫu? Cảm ơn!
Ruchir Baronia

@Rich Hãy tham khảo câu trả lời của tôi. '-1' là chỉ số mà độ rung sẽ cố gắng lặp lại từ đó, sau khi theo mẫu lần đầu tiên. '-1' nằm ngoài giới hạn, do đó rung không lặp lại.
Liam George Betsworth

@Rich - Liam George Betsworth là chính xác. Tài liệu Android cho biết - Để khiến mẫu lặp lại, hãy chuyển chỉ mục vào mảng mẫu để bắt đầu lặp lại hoặc -1 để tắt lặp lại. Liên kết - developer.android.com/reference/android/os/ Mạnh, int)
Atul O Holic

14

Tôi đấu tranh để hiểu làm thế nào để thực hiện điều này trong lần thực hiện đầu tiên của tôi - đảm bảo bạn có những điều sau:

1) Thiết bị của bạn hỗ trợ rung (máy tính bảng Samsung của tôi không hoạt động nên tôi tiếp tục kiểm tra lại mã - mã gốc hoạt động hoàn hảo trên CM Touchpad của tôi

2) Bạn đã khai báo ở trên mức ứng dụng trong tệp AndroidManifest.xml để cấp quyền chạy mã.

3) Đã nhập cả hai thứ sau vào MainActivity.java của bạn với các lần nhập khác: nhập android.content.Context; nhập android.os.Vibrator;

4) Gọi rung của bạn (đã thảo luận nhiều về chủ đề này) - Tôi đã thực hiện nó trong một chức năng riêng biệt và gọi mã này ở các điểm khác - tùy thuộc vào những gì bạn muốn sử dụng để gọi rung bạn có thể cần một hình ảnh ( Android: nhấp dài vào nút -> thực hiện hành động ) hoặc trình nghe nút hoặc đối tượng có thể nhấp như được xác định trong XML ( Hình ảnh có thể nhấp - android ):

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

10

Rung mà không cần sự cho phép

Nếu bạn chỉ muốn rung thiết bị một lần để cung cấp phản hồi về hành động của người dùng. Bạn có thể sử dụng performHapticFeedback()chức năng của a View. Điều này không cần sự VIBRATEcho phép để được tuyên bố trong bản kê khai.

Sử dụng hàm sau làm hàm cấp cao nhất trong một số lớp phổ biến như Utils.kt của dự án của bạn:

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

Và sau đó sử dụng nó ở bất cứ đâu trong Fragmenthoặc Activitynhư sau:

vibrate(requireView())

Đơn giản như thế!


2
Giải pháp tốt và đơn giản!
VAdaihiep

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

nên được thêm vào bên trong <manifest>thẻ và bên ngoài <application>thẻ.


4

Tôi sử dụng phương pháp utils sau:

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

Thêm quyền sau vào tệp AndroidManifest

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

Bạn có thể sử dụng các phương thức quá tải trong trường hợp nếu bạn muốn sử dụng các loại rung động khác nhau (mẫu / không xác định) như đề xuất ở trên.


4

Câu trả lời trên là rất đúng nhưng tôi đang đưa ra một bước dễ dàng để làm điều đó:

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

Và sau đó trong tệp xml của bạn:

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

Đó là cách dễ nhất .


3

Rung trong Mẫu / Sóng :

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

Thêm

Sự cho phép cần thiết trong AndroidManifest.xml:

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

3

Cập nhật Kotlin cho nhiều loại an toàn hơn

Sử dụng nó như một hàm cấp cao nhất trong một số lớp phổ biến của dự án của bạn, chẳng hạn như 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)
        }
    }
}

Và sau đó gọi nó ở bất cứ đâu trong mã của bạn như sau:

vibrateDevice(requireContext())

Giải trình

Sử dụng Vibrator::class.javalà loại an toàn hơn so với sử dụngString hằng.

Chúng tôi kiểm tra mức độ vô hiệu vibratorbằng cách sử dụng let { }, vì nếu không có rung cho thiết bị, thì vibratorsẽnull .

Bạn có thể giảm bớt sự phản đối else mệnh đề vì cảnh báo là từ SDK mới hơn.

Chúng tôi không cần phải xin phép trong thời gian chạy để sử dụng rung. Nhưng chúng ta cần khai báo nó AndroidManifest.xmlnhư sau:

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

2

Dùng cái này:

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

Ghi chú:

Đừng quên bao gồm quyền trong tệp AndroidManifest.xml:

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

1

Bạn có thể Rung thiết bị và công việc của thiết bị

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

Quyền là cần thiết nhưng không phải là cho phép thời gian chạy

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

giải pháp này không được chấp nhận
BekaBot
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.