我试图让手表在不定期的特定时刻振动。
当手表的屏幕打开时我没有问题但是当手表屏幕变暗时它不能正常工作。
我已经在这里阅读了几个问题和Android开发人员在WakeLocks上的页面,我认为这就是我需要的......但它对我不起作用。以下是我的代码,我做错了吗?
首先,在我的Manifest文件中,我有:
<uses-permission android:name="android.permission.WAKE_LOCK" />
以下是我的部分代码:
PowerManager.WakeLock wakeLock;
@Override
public void onCreate(SurfaceHolder holder) {
super.onCreate(holder);
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, TAG);
}
private void vibrate(int duration) {
wakeLock.acquire();
Vibrator v = (Vibrator) getBaseContext().getSystemService(Context.VIBRATOR_SERVICE);
v.vibrate(duration);
wakeLock.release();
}
屏幕无法开启且手表不振动......我做错了什么?
谢谢!
答案 0 :(得分:0)
如果您的手表在收到通知时没有振动,或者您根本没有看到通知,请在每个步骤后检查手表,看看通知是否开始工作。尝试以下troubleshooting步骤:
尝试使用标记FLAG_KEEP_SCREEN_ON
唤醒设备。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
这种方法的优点在于,与唤醒锁不同,它不需要特殊权限,平台可以正确管理用户在应用程序之间移动,而无需您的应用程序担心释放未使用的资源。
实现此目的的另一种方法是在应用程序的布局XML文件中,使用android:keepScreenOn
属性:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:keepScreenOn="true">
...
</RelativeLayout>
使用android:keepScreenOn="true"
相当于使用 FLAG_KEEP_SCREEN_ON 。您可以使用最适合您应用的方法。
答案 1 :(得分:0)
只要您希望手表保持交互(并且振动继续 - 您必须处于交互式振动状态),您需要保持获取唤醒锁定,但您似乎在获取后立即释放唤醒锁定它。
获取唤醒锁定可能存在风险,因此如果您从监视面部服务运行该代码(不能从您的代码片段中清除),请在获取唤醒锁定时启动透明活动,并在活动死亡时释放它 - 这您正在使用活动生命周期作为停止振动并释放唤醒锁定的方法。这是我在ustwo Timer Watch Faces中实现的(当计时器到期时,表盘开始以交互模式闪烁和振动),并且它运行良好。
另外,请记住,要使振动起作用,您需要在清单中声明振动权限:
<uses-permission android:name="android.permission.VIBRATE" />