2016-01-26 4 views
2

Это странный вариант.FLAG_KEEP_SCREEN_ON работает в обратном порядке

Я был ранее с помощью: android:keepScreenOn="true"

в моем файле макета, чтобы держать экран на в деятельности, и это работало нормально.

Однако я хотел улучшить, чтобы экран сохранялся только тогда, когда веб-приложение находится в определенном состоянии. (Пользователь должен по-прежнему иметь возможность отключить экран, если он пожелает, я просто хочу отключить тайм-аут - что выше в файле макета достигает всякий раз, когда актив активен.)

Для этого у меня есть Интерфейс JavaScript добавляет к WebView, который боксирует следующие два метода.

Я прокомментировал настройку keepScreenOn в макете.

@JavascriptInterface 
public void keepScreenOn(){ 
    Toast.makeText(mContext, "Keeping screen on", Toast.LENGTH_LONG).show(); 
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
} 
@JavascriptInterface 
public void allowScreenOff(){ 
    Toast.makeText(mContext, "Allowing screen off", Toast.LENGTH_LONG).show(); 
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
} 

Теперь правильно Toast отображается, но «держать экран на» действия наоборот.

i.e, когда я получаю Toast, говоря, что на экране будет храниться тайм-аут и переключатели через пару минут. НО, когда я получаю Toast, говоря, что на экране будет разрешено отключать экран, на самом деле он остается включенным, даже не выставляя время.

Я не понимаю, как это может быть.


ОК, участок утолщается.

Кажется, это не всегда может быть поворот операции, но может быть случайной работой/нерабочей ситуацией.

Кроме того, глядя в журнал в Android Studio, я получаю сообщение об ошибке, которая говорит:

01-26 20:22:51.358 2182-5629/com.nooriginalthought.bluebadgeparking E/ViewRootImpl: com.nooriginalthought.bluebadgeparking.websiteViewActivity : Only the original thread that created a view hierarchy can touch its views. 

при вызове метода.

НО, но он действительно работает.

Методы, показанные выше, находятся в пределах класса websiteViewActivity, но не входят в метод onCreate. Боюсь, я не знаю, является ли это актуальным или как обеспечить, чтобы addFlags и clearFlags выполнялись в правильной теме, если это имеет значение.

[Edit: This question объясняет, как получить вещи, работающие в потоке пользовательского интерфейса и избавилась от «Только оригинальная тема» ошибки.]

А почему она иногда работает (я не могу сказать, ошибка появляется в журнале, когда она работает или нет, поскольку я видел, как она работает при тестировании от моего ПК)?

+0

Я в настоящее время тестирования затруднительного runOnUIthread на посте подкладки в моем редактировании, чтобы увидеть, если это решит проблему оригинальной (а не только ошибка). Пока ничего хорошего. –

+0

Вопрос, связанный в моем редактировании (который имеет то же решение, что и ответ GeNia), разрешил проблему. Я все еще не знаю, почему я видел такое странное поведение, но вместо того, чтобы просто не работать. –

ответ

0

Текст «Только оригинальный поток, который создал иерархию вида может коснуться его мнение» означает, что вы выполняете этот код из неосновной нити, которая также называется UI тема.

WebView обычно выполняет javascript в фоновом потоке, поэтому вы получаете эту ошибку.

Попробуйте использовать «runOnUiThread()»

runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      Toast.makeText(mContext, "Keeping screen on", Toast.LENGTH_LONG).show(); 
      getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
     } 
    }); 
+0

Спасибо GeNia. Это именно то, что я нашел в потоке, выровненном в моем редактировании. Очень простое решение для переноса вещей в поток пользовательского интерфейса. Я должен прочитать о последствиях этого, но буду помнить о подобных проблемах в будущем. –

-1
private Window wind; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    //your code 

    wind = this.getWindow(); 
    wind.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
    wind.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 
    wind.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
    wind.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
} 
+0

Я не думаю, что это то, что я хочу. Я считаю, что приведенный выше код разбудит телефон и покажет активность. Все, что я хочу, это заставить экран оставаться включенным (т. Е. Не тусклым или выключенным после таймаута), в то время как веб-приложение находится в определенном состоянии - при этом пользователь все еще может отключить экран, если захочет. Для этого я считаю, что мне нужен только FLAG_KEEP_SCREEN_ON', но он работает в обратном порядке. –

Смежные вопросы