web-dev-qa-db-fra.com

java.lang.NullPointerException avec Nougat

Mon application a bien chanté avec différentes versions d'Android. J'ai des utilisateurs qui l'exécutent sur Android 4.3, 5.0, 5.1 et 6.0 sans aucun problème. Cependant, un utilisateur doté d’un S7 Edge vient de mettre à jour Android 7.0 et l’application se bloque lorsque du texte est collé dans un champ EditText (c’est la première et unique chose que vous fassiez avec cette application: elle commence à coller du texte dans une zone et puis l'application analyse le texte). 

J'ai consulté de nombreuses discussions sur Null Pointer Exceptions et j'ai examiné la source de Editor.Java, mais rien n'est évident. La trace de pile ci-dessous ne montre aucun problème avec mon code. Des idées sur ce qu'ils ont changé avec 7.0 qui pourraient être la cause?

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)
12
Gavin

C'est ainsi que vous empêchez le menu copier-coller de s'afficher de quelque manière que ce soit. Ce bogue m'a vraiment rendu fou, et comme pour tout bogue Samsung, vous savez qu'il est dans leur code, mais vous savez aussi qu'ils ne le répareront pas de sitôt. Quoi qu'il en soit, voici mur de merveille ...

  1. Vérifiez si Android.Build.Model.toLowerCase (). StartsWith ('sm-g930'). Ne correspond pas à la chaîne entière, la dernière lettre est un identificateur de version mineure. J'ai stocké ce booléen dans la variable shouldBlockCopyPaste qui apparaîtra plus tard.

  2. Si cela correspond, vous souhaitez empêcher l'affichage du menu copier-coller. Voici comment vous le faites réellement !!!

Si vous remplacez ces 2 fonctions, vous remarquerez que mon objet shouldBlockCopyPaste est booléen, afin que les autres périphériques ne soient pas bloqués.

   @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);
      }
    }
4
self.name

Je l'ai résolu en enlevant

MyEditText.setMovementMethod (new ScrollingMovementMethod ());

4
B J

Cela fait un certain temps que mon appli rencontre un blocage sur mon appareil Samsung. Il s'est avéré qu'un appui long sur un TextView ouvrait le menu copier-coller de ces périphériques et que l'utilisateur était même capable de coller du texte (bien que ce ne soit pas un composant EditText). Nous avons fini par désactiver tous les types d’interactions dans le code XML du TextViews du coupable (le plus important est longClickable) et le crash n’était pas parti. 

 <TextView
...
    Android:longClickable="false"
    Android:clickable="false"
    Android:linksClickable="false" />
0
N M