Câu trả lời:
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"/>
vibrate(VibrationEffect)
Thay vào đó, hãy sử dụng .
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.
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.
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!
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();
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);
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 .
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.
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)
}
}
getSystemService
bằngthis.getContext().getSystemService
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
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 đấ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);
}
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ự VIBRATE
cho 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 Fragment
hoặc Activity
như sau:
vibrate(requireView())
Đơn giản như thế!
<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ẻ.
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.
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 .
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"/>
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())
Sử dụng Vibrator::class.java
là 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 vibrator
bằng cách sử dụng let { }
, vì nếu không có rung cho thiết bị, thì vibrator
sẽ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.xml
như sau:
<uses-permission android:name="android.permission.VIBRATE"/>
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"/>
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"/>