1

Я пытаюсь устранить сложную, трудноразрешимую проблему (возможно, связанную с оборудованием) для open source Panic Button application. Я работаю над Amnesty. Там an issue on github about it.Кнопка сама нажата (возможно, для конкретного устройства)

Вопрос относится к LinearLayout View with Buttons. Когда отображается в this fragment, когда я пытаюсь удерживать кнопку, она просто подавляет себя через секунду. При регистрации события onClick он автоматически запускается автоматически, даже если я не выпустил свой палец с экрана.

Это происходит на телефоне Cherry Gem, и я не смог воспроизвести проблему на других телефонах.

Я удаляю много кода и добавляю много операторов регистрации, чтобы попытаться изолировать ошибку, когда обнаружил самое странное, что привело меня к публикации в Stack Overflow, поскольку это довольно странно, что, возможно, кто-то узнает рисунок:

Когда я перетаскиваю палец по экрану, ошибка исчезает! Точнее, после подтверждения на экране, что кнопка несколько раз нажата, если я удерживаю и таща пальцем, затем отпустите ее, после чего я могу удерживать нажатые кнопки без их нажатия. Wat?

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

Я не уверен на 100%, если может быть нежелательное взаимодействие с остальной частью кода, а также попытаться создать минималистский проект с нуля только с этим кодом, если никто не распознает шаблон здесь.

Я также могу разместить небольшое видео проблемы, если это помогает. Я также рад опубликовать отрывки из кода или результаты logcat.

Спасибо за ваше время!

июня

Update

Я посмотрел на the adb shell getevent log, который подтверждает, что после .9 секунд есть EV_KEY BTN_TOUCH UP событие. Означает ли это, что с точки зрения ОС он получает событие от аппаратного обеспечения на кнопке вверх? Я думаю, это может быть вызвано программным обеспечением.

Это привело меня к изучению программного обеспечения, установленного на телефоне, и могло помешать работе с устройствами ввода. Я отключил ввод голоса Google, а затем снова нажали кнопки. Повторная активация голосового набора Google не привела к появлению ошибки. При перезагрузке телефон снова появляется ошибка.

Я попытался посмотреть, были ли затронуты только некоторые приложения. Также был затронут предустановленный калькулятор. При использовании виртуальной клавиатуры по умолчанию ошибка не была. Но затем, возвращаясь к моему приложению, ошибка снова исчезла. Перезагрузите снова. Калькулятор по-прежнему влияет. Вернитесь к использованию виртуальной клавиатуры в браузере. Теперь ошибка остается ... Ват?

Через некоторое время я снова удалил устройство ввода текста Google Voice, и ошибка исчезла еще раз.

Я отслеживал форум, где, кажется, есть ром для этого телефона, я пытаюсь выяснить, является ли он более поздним, чем версия, которую я имею, или если кто-то еще с этим телефоном испытал эту проблему.

(я также обновил relevant github issue)

Update 2

я заметил следующее в LogCat:

04-01 12:05:30.484: V/PhoneWindow(2749): DecorView setVisiblity: visibility = 0 
04-01 12:05:30.525: V/InputMethodManager(2749): onWindowFocus: null softInputMode=288 first=true flags=#1810100 
04-01 12:05:30.528: V/InputMethodManager(2749): START INPUT: com.android.internal.policy.impl.PhoneWindow$DecorView{41aa5ef8 V.E..... R.....ID 0,0-480,800} ic=null [email protected] controlFlags=#104 
04-01 12:05:30.530: V/InputMethodManager(2749): Starting input: Bind result=InputBindResult{[email protected]8 com.android.inputmethod.latin/.LatinIME #45} 
04-01 12:05:30.608: I/InputMethodManager(2749): handleMessage: MSG_SET_ACTIVE true, was false 

Может ли это быть частью этой проблемы?

+0

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

+0

Спасибо, Jonas. Боюсь, что это не причина. Другие кнопки на других экранах или приложениях могут долгое нажатие просто отлично. Именно это делает это. – jun

+0

Боюсь, я не знаю, почему это происходит, но если вы хотите, я могу поместить в ваш вопрос [bounty] (http://stackoverflow.com/help/bounty), который станет более заметным, и (надеюсь) ответ. Просто скажите мне это через два дня (необходимое время для ожидания), и я могу это сделать. – JonasCz

ответ

1

Для нечетных таких проблем, как это, я думаю, что это полезно, чтобы переопределить onTouchEvent слушателя, и наблюдать, которые MotionEvent срабатывает (как ACTION_MOVE, ACTION_UP/DOWN). Коренной проблемой может быть драйвер сенсорного экрана устройства. Поэтому может быть хорошо протестировать этот драйвер с помощью onTouchEvent.

Существует, я думаю, хорошая веб-страница @Touch Device Configuration. Текст для поиска «Уровень сигнала отчета пилота как давление». Я думаю, что это интересно и, возможно, вы можете просто изменить значения touch.pressure. калибровка или/шкала для устранения неполадок. Этот файл имеет расширение idc, должен находиться в системном подкаталоге.

Я хочу предоставить образец кода для переопределения мыши/Swiping события:

@Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     switch (ev.getAction() & MotionEvent.ACTION_MASK) { 
      // Make sure ACTION_DOWN is dispatched to children view 
      case MotionEvent.ACTION_DOWN: 
       onTouchEvent(ev); 

       // Allow the children view to process this action 
       return false;  // skip calling onInterceptTouchEvent 

      case MotionEvent.ACTION_MOVE: 
       onTouchEvent(ev); 
       return false; 

      default: 
       break; 
     } 
     return super.onInterceptTouchEvent(ev); 
    } 

    @Override 
    public boolean onTouchEvent (MotionEvent event) { 

     switch (event.getAction() & MotionEvent.ACTION_MASK) { 
      case MotionEvent.ACTION_DOWN: 
       mDownX = (int)event.getX(); 
       mDownY = (int)event.getY(); 
       break; 
      case MotionEvent.ACTION_MOVE: 
... 

Примечания:

  • Метод onInterceptTouchEvent происходит до onTouchEvent.
  • Этот метод перехватывает все события движения сенсорного экрана. Это позволяет вам наблюдать за событиями, пока они отправляются вашим детям.
+0

Спасибо! Я [попробовал adb shell getevent] (https://github.com/iilab/PanicButton/issues/63#issuecomment-88397065), который, как я думаю, в том же духе, что и ваша рекомендация, и обновил мой пост с дальнейшими результатами тестирования , Я думаю, что проблема заключается не в нормальной работе самого аппаратного обеспечения или с драйвером, а в чем-то, что мешает ему. Может быть, еще одна услуга, которая может подключиться к устройству ввода, или что-то с прошивкой, которая не подходит ... Как вы думаете, это возможно? – jun

+0

Мне трудно поверить, что служба отправит клики на устройство или в приложение, подобное вашему. Я прочитал ваши результаты в журнале, и Google Voice, похоже, является виновником этой проблемы. Но удалить это приложение сложно, учитывая, что у вас нет прямого контроля над другим (возможно, популярным) приложением. Так что это нехорошее решение. Возможно, это проще, если решение - просто обновить версию Android. –

+2

Я даю вам щедрость, хотя ваш ответ не самый лучший, так как мне не нравится видеть, что реквизит щедрот просто исчезает. Может быть, вы могли бы немного улучшить/расширить свой ответ? – JonasCz

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