java.lang.NullPointerException с нугой

Мое приложение прекрасно работает в различных версиях Android. У меня есть пользователи, запускающие его на Android 4.3, 5.0, 5.1 и 6.0 без проблем. Однако пользователь с S7 Edge только что обновился до Android 7.0, и приложение дает сбой, когда текст вставляется в поле EditText (это первое и единственное, что вы делаете с этим приложением — оно начинает вставлять текст в поле и затем приложение анализирует текст).

Я просмотрел множество потоков, посвященных исключениям нулевого указателя, и я просмотрел источник Editor.java, но ничего не очевидно. Трассировка стека ниже не показывает проблем с моим кодом. Есть идеи, что они изменили в 7.0, что может быть причиной этого?

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.widget.Editor$SelectionModifierCursorController.isDragAcceleratorActive()' on a null object reference
at android.widget.Editor.updateFloatingToolbarVisibility(Editor.java:1520)
at android.widget.Editor.onTouchEvent(Editor.java:1475)
at android.widget.TextView.onTouchEvent(TextView.java:10024)
at android.view.View.dispatchTouchEvent(View.java:10725)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2865)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2550)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2865)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2550)
at android.widget.ScrollView.dispatchTouchEvent(ScrollView.java:738)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2865)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2550)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2865)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2550)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2865)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2550)
at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:505)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1863)
at android.app.Activity.dispatchTouchEvent(Activity.java:3226)
at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:467)
at android.view.View.dispatchPointerEvent(View.java:10954)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5051)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4908)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4439)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4492)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4458)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4591)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4466)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4648)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4439)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4492)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4458)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4466)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4439)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6936)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6875)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6836)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7046)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:176)
at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:7010)
at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:7073)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:927)
at android.view.Choreographer.doCallbacks(Choreographer.java:702)
at android.view.Choreographer.doFrame(Choreographer.java:632)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:913)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6688)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)

person Gavin    schedule 21.03.2017    source источник
comment
Вы видели stackoverflow.com/questions/41687484/ или stackoverflow.com/questions/37978026/   -  person René Hoffmann    schedule 21.03.2017
comment
Похоже, это известная проблема: code.google.com/p/ android/issues/detail?id=228485   -  person René Hoffmann    schedule 21.03.2017
comment
Не совсем тот же метод дает сбой, но это частично полезно, поскольку это не мое приложение. Однако я хотел бы знать, как обойти это. Как я уже сказал, мое приложение ничего не делает, когда они вставляют текст :-(   -  person Gavin    schedule 21.03.2017
comment
@Gavin: Указанная ошибка и ваш сбой происходят на устройствах Samsung. Можете ли вы воспроизвести проблему в эмуляторе или в среде Android 7.0+, отличной от Samsung?   -  person CommonsWare    schedule 22.03.2017
comment
@CommonsWare У меня не было возможности как следует поэкспериментировать с эмулятором. Я вижу, что некоторые другие пользователи используют Android 7 на панели инструментов, но у меня есть только один пользователь, сталкивающийся с этой проблемой в данный момент, и они сообщают, что проблема возникла после обновления до Nougat.   -  person Gavin    schedule 25.03.2017
comment
У меня такая же проблема. Это происходит исключительно (но время от времени) на устройствах Samsung с Android 7.0. Никогда не видел его в реальной жизни, но через HockeyApp поступает постоянный поток отчетов о сбоях. :/   -  person Matthias Schicker    schedule 12.05.2017
comment
У нас такая же проблема. Происходит на нескольких устройствах Samsung (S6, S7, Edge, Active и т. д.). И только на Android 7.0   -  person Zhao    schedule 16.05.2017
comment
У меня не было никаких изменений в этом вопросе. Пользователь сообщил, что нашел обходной путь, вставив его каким-то другим способом, но у меня нет подробностей о том, как он заставил его работать.   -  person Gavin    schedule 18.05.2017
comment
У меня такая же проблема на Samsung S6 (Android 7.0)   -  person Alireza Noorali    schedule 03.03.2018
comment
Пользователь только что сообщил мне, что обновление Oreo на его S8 устранило эту проблему.   -  person Gavin    schedule 18.04.2018


Ответы (3)


Я решил это, удалив

MyEditText.setMovementMethod (новый метод ScrollingMovement());

person Community    schedule 04.02.2018
comment
Спасибо. Я использовал его для прокрутки, и это решение работает для меня. - person Awais; 07.02.2018

Таким образом вы блокируете появление меню копирования и вставки в любом виде, форме или форме. Эта ошибка действительно сводила меня с ума, и, как и в случае с любой ошибкой Samsung, вы знаете, что она в их коде, но вы также знаете, что они не исправят ее в ближайшее время. В любом случае, вот чудо-стена...

  1. Проверьте, работает ли Android.Build.Model.toLowerCase().startsWith('sm-g930'). Не совпадать со всей строкой, последняя буква является дополнительным идентификатором версии. Я сохранил это логическое значение в переменной shouldBlockCopyPaste, которая появится позже.

  2. Если он совпадает, вы хотите заблокировать отображение меню копирования и вставки. Вот как ВЫ НА САМОМ ДЕЛЕ ДЕЛАЕТЕ!!!

Переопределите эти 2 функции, вы заметите мое логическое значение shouldBlockCopyPaste, чтобы другие устройства не блокировались.

   @Override
   public ActionMode StartActionMode (ActionMode.Callback callback){
      if (shouldBlockCopyPaste) {
        return null;
      } else {
        return super.StartActionMode(callback);
      }
    }

   @Override
   public ActionMode StartActionMode (ActionMode.Callback callback, int type){
      if (shouldBlockCopyPaste) {
        return null;
      } else {
        return super.StartActionMode(callback, type);
      }
    }
person self.name    schedule 31.05.2017
comment
Это решение не сработало. Сработало ли это с вами? Есть ли у вас другие предлагаемые решения? - person user1510006; 07.06.2017

Я некоторое время наблюдал этот сбой в своем приложении на устройствах Samsung. оказалось, что долгое нажатие на TextView вызывало меню копирования-вставки на этих устройствах, и пользователь даже мог вставлять текст (хотя это не компонент EditText). Закончилось отключением всех типов взаимодействий в XML виновника TextViews (самое главное longClickable), и сбой не исчез.

 <TextView
...
    android:longClickable="false"
    android:clickable="false"
    android:linksClickable="false" />
person N M    schedule 07.04.2018
comment
Пользователь только что сообщил мне, что после обновления Oreo на его S8 эта проблема исчезла. к вашему сведению. - person Gavin; 18.04.2018