环境/黑屏常见的可穿戴震动

时间:2016-11-04 13:40:04

标签: android alarmmanager android-vibration moto-360 ambient

我试图为智能手表编写一个模拟心跳的应用程序,因此它需要能够以1秒到0.5-0.3秒的时间间隔振动,持续时间为75毫秒。

当应用程序进入环境模式或开始全黑屏时,它也需要执行此操作。我不关心功耗或其他什么,它应该只能运行20-30分钟,没有别的。

在我正在开发的Moto360上,如果您不将手表放在某个位置,环境模式将变成全黑屏,一旦进入黑屏,振动就会停止,所以我需要一个适用于黑屏的解决方案,除非有办法让手表停止,进入黑屏,我不知道。

当只是处理onEnterAmbient等事件时,手表停止振动,当你因为进入黑屏而没有以正确的角度握住它时,并且由于不得不打电话,振动并不总是一致的在进入/更新等时再次使用vibrator.vibrate()方法,因此通常会导致振动模式的小不一致,应该避免。因此,我认为使用环境模式的方法不起作用。

以下是原代码:

[...]
private long[] vibrationPattern_StandardPulse = {0, 75, 1000};
private long[] vibrationPattern_AcceleratedPulse = {0, 75, 600};
[...]
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    setAmbientEnabled();
    mContainerView = (BoxInsetLayout) findViewById(R.id.container);
    vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
[...]
@Override
public void onEnterAmbient(Bundle ambientDetails) {
    super.onEnterAmbient(ambientDetails);
    keepVibrating();
}

@Override
public void onUpdateAmbient() {
    super.onUpdateAmbient();
    keepVibrating();
}

@Override
public void onExitAmbient() {
    super.onExitAmbient();
    keepVibrating();
[...]
 public void keepVibrating() {
    if (standardPulse) {
        vibrator.vibrate(vibrationPattern_StandardPulse, 0);
    } else {
        vibrator.vibrate(vibrationPattern_AcceleratedPulse, 0);
    }
}
[...]

所以我再次尝试使用闹钟管理器(坚持这个链接:https://developer.android.com/training/wearables/apps/always-on.html#UpdateContent),以便能够在Blackscreen中发送振动,但事实证明,闹钟管理器的计时器不能设置为这么小的间隔?它只会每隔约5秒振动一次,无论是黑屏,还是正常模式或环境模式,都应该是1s或更小...

代码:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    setAmbientEnabled();
    mAmbientStateAlarmManager =
            (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent ambientStateIntent =
            new Intent(getApplicationContext(), MainActivity.class);

    mAmbientStatePendingIntent = PendingIntent.getActivity(
            getApplicationContext(),
            0,
            ambientStateIntent,
            PendingIntent.FLAG_UPDATE_CURRENT);

    mContainerView = (BoxInsetLayout) findViewById(R.id.container);
    //mClockView = (TextView) findViewById(R.id.clock);
    vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
[...]}
@Override
public void onNewIntent(Intent intent) {
    super.onNewIntent(intent);

    setIntent(intent);

    refreshDisplayAndSetNextUpdate();
}

private long AMBIENT_INTERVAL_MS = 0;

private void refreshDisplayAndSetNextUpdate() {
    if (standardPulse) {
        AMBIENT_INTERVAL_MS = 1000;
    } else {
        AMBIENT_INTERVAL_MS = 600;
    }

    if (isAmbient()) {
        // Implement data retrieval and update the screen for ambient mode
        vibrator.vibrate(75);
    } else {
        // Implement data retrieval and update the screen for interactive mode
        vibrator.vibrate(75);
    }

    long timeMs = System.currentTimeMillis();

    // Schedule a new alarm
    if (isAmbient()) {
        // Calculate the next trigger time
        long triggerTimeMs = timeMs + AMBIENT_INTERVAL_MS;

        mAmbientStateAlarmManager.setExact(
                AlarmManager.RTC_WAKEUP,
                triggerTimeMs,
                mAmbientStatePendingIntent);

    } else {
        // Calculate the next trigger time for interactive mode
        long triggerTimeMs = timeMs + AMBIENT_INTERVAL_MS;

        mAmbientStateAlarmManager.setExact(
                AlarmManager.RTC_WAKEUP,
                triggerTimeMs,
                mAmbientStatePendingIntent);
    }
}

然后在onEnterAmbient事件等中调用RefreshUpdateAndSetNextAlarm但不能正常工作。有没有办法在智能手表上做这些事情,特别是在Moto 360上?

也许如果我通过messageAPI从智能手机不断发送消息并将其设置为紧急?

1 个答案:

答案 0 :(得分:0)

解决方案是使用CPU Wakelock:

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
            "MyWakelockTag");
wakeLock.acquire();

并且屏幕保持开启 - 标志:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);