Разрешить вибрации телефона при выключении экрана
Я ищу способ, позволяющий моей программе заставить телефон вибрировать после отключения экрана по истечении времени ожидания. Я провел много исследований, и не нашел то, что работает. Я посмотрел на класс PowerManager и, более конкретно, механизм WakeLock. Судя по многим постам, мне нужно будет использовать переменную PARTIAL_WAKE_LOCK класса WakeLock.
PARTIAL_WAKE_LOCK - блокировка пробуждения, обеспечивающая работу процессора.
Однако я не могу заставить его вибрировать телефон, когда экран выключается. Я знаю, что правильно использую WakeLock, потому что могу заставить SCREEN_DIM_WAKE_LOCK работать. PARTIAL_WAKE_LOCK - это то, что я ищу?
3 ответа
@Override
public void onCreate() {
super.onCreate();
// REGISTER RECEIVER THAT HANDLES SCREEN ON AND SCREEN OFF LOGIC
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
BroadcastReceiver mReceiver = new ScreenReceiver();
registerReceiver(mReceiver, filter);
}
@Override
public void onStart(Intent intent, int startId) {
boolean screenOn = intent.getBooleanExtra("screen_state", false);
if (!screenOn) {
// Get instance of Vibrator from current Context
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
// This example will cause the phone to vibrate "SOS" in Morse Code
// In Morse Code, "s" = "dot-dot-dot", "o" = "dash-dash-dash"
// There are pauses to separate dots/dashes, letters, and words
// The following numbers represent millisecond lengths
int dot = 200; // Length of a Morse Code "dot" in milliseconds
int dash = 500; // Length of a Morse Code "dash" in milliseconds
int short_gap = 200; // Length of Gap Between dots/dashes
int medium_gap = 500; // Length of Gap Between Letters
int long_gap = 1000; // Length of Gap Between Words
long[] pattern = {
0, // Start immediately
dot, short_gap, dot, short_gap, dot, // s
medium_gap,
dash, short_gap, dash, short_gap, dash, // o
medium_gap,
dot, short_gap, dot, short_gap, dot, // s
long_gap
};
// Only perform this pattern one time (-1 means "do not repeat")
v.vibrate(pattern, -1);
} else {
// YOUR CODE
}
}
Обратите внимание, что вы должны добавить строку с правами на использование в свой файл Manifest.xml вне блока.
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="...">
<uses-permission android:name="android.permission.VIBRATE"/>
примечание: вы также должны проверить этот код на реальном телефоне, эмулятор не может вибрировать
Для меня решение было использовать прямую вибрацию без шаблонов, поэтому мне не нужно использовать PowerManager, чтобы активировать блокировку.
long vibrationDuration = 5000L; // 5 seconds or 5000 milliseconds
int vibrationAmplitude = 200; // between 1 and 255
Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
VibrationEffect vibe = VibrationEffect.createOneShot(vibrationDuration, vibrationAmplitude);
// for API level 33 or higher
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU)
vibrator.vibrate(vibe, VibrationAttributes.createForUsage(VibrationAttributes.USAGE_MEDIA));
else
vibrator.vibrate(vibe, new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA).build());