У меня очень простое приложение для Android Wear, которое в основном представляет собой только одну кнопку на мобильном устройстве, которую я хочу использовать, чтобы включить и выключить отображение устройства Android Wear. У меня есть приложение, отправляющее сообщения на устройство Android Wear, чтобы сообщить ему о приобретении или выпуске wakeLock в зависимости от состояния экрана. WakeLock.acquire() работает отлично, но когда я отправляю сообщение, чтобы освободить wakeLock, приложение неправильно. Приобретение wakeLock, похоже, всегда работает, но его выпуск приведет к одному из следующих: он либо сбой, либо скажет «К сожалению, ваше приложение перестало работать», или оно ничего не сделает (как будто он считает, что я не держу wakeLock, чтобы он даже не входил в if-statment, в котором содержится запрос на выпуск), или он увидит, что он удерживается, но мой вызов wakeLock.release(), похоже, фактически не освобождает блокировку (экран никогда не тускнеет). Есть идеи?Android Wear приложение, которое падает при выпуске wakeLock
Мобильный Код устройства:
// sendToast is the onClickListener function for my toggleButton
private void sendToast() {
if(isChecked(findViewById(R.id.toggleButton)))
message = ON_MESSAGE;
else
message = OFF_MESSAGE;
if (nodeId != null) {
new Thread(new Runnable() {
@Override
public void run() {
client.blockingConnect(CONNECTION_TIME_OUT_MS, TimeUnit.MILLISECONDS);
Wearable.MessageApi.sendMessage(client, nodeId, message, null);
client.disconnect();
}
}).start();
}
}
private boolean isChecked(View view) {
if (((ToggleButton) view).isChecked())
return true;
else
return false;
}
Wear Код устройства:
public class ListenerService extends WearableListenerService {
private PowerManager powerManager;
private PowerManager.WakeLock wakeLock;
private static final String ON_MESSAGE = "On!";
private static final String OFF_MESSAGE = "Off!";
boolean first = true;
private void setupWakeLock() {
powerManager = (PowerManager) getSystemService(POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK |
PowerManager.ACQUIRE_CAUSES_WAKEUP, "wakeLock"); // SCREEN_BRIGHT_WAKE_LOCK
}
@Override
public void onMessageReceived(MessageEvent messageEvent) {
if (first) {
setupWakeLock();
first = false;
}
Toast.makeText(this, wakeLock.toString(), Toast.LENGTH_LONG).show();
if (messageEvent.getPath().equals(ON_MESSAGE)) {
if (!wakeLock.isHeld()) {
wakeLock.acquire();
Toast.makeText(this, ON_MESSAGE, Toast.LENGTH_LONG).show();
}
} else if (messageEvent.getPath().equals(OFF_MESSAGE)) {
if (wakeLock.isHeld()) {
wakeLock.release();
Toast.makeText(this, OFF_MESSAGE, Toast.LENGTH_LONG).show();
}
}
}
private void showToast(String message) {
Toast.makeText(this, message, Toast.LENGTH_LONG).show();
}
}
Я на основе проекта от проекта я нашел на GitHub и изменил некоторые вещи вокруг. Я не пытаюсь разработать приложение для распространения только одноразовое приложение для моего собственного использования. Я использую wakeLock, потому что код Android Wear находится в Службе Listener (нет активности, поэтому у меня нет окна для получения и установки флагов или чего-то еще). Я тестирую, используя планшет Asus и круглый эмулятор Android Wear. Включение/выключение дисплея - такая простая функция, что я не мог найти поддержку в каких-либо сторонних приложениях, на которые я смотрел, и тот факт, что он дает мне эту проблему, полностью сходит с ума. Благодарим за любую идею!