空指针异常:int android.widget.Editor$SelectionModifierCursorController.getMinTouchOffset()
NullPointerException: int android.widget.Editor$SelectionModifierCursorController.getMinTouchOffset()
非常奇怪的小米设备的OS异常。即使我确实有 Fabric 提供的日志,堆栈跟踪也不会引用我的任何代码。
crashalytics(Fabric) 中报告的崩溃详细信息如下,
21K 次崩溃
小米设备全部崩溃
在 Android OS 版本 6、7 和 8
上崩溃
崩溃日志:
# OS Version: 8.1.0
# Device: Redmi Note 5 pro
# RAM Free: 30.1%
# Disk Free: 74.2%
#0. Crashed: main
at android.widget.Editor.touchPositionIsInSelection(Editor.java:1084)
at android.widget.Editor.performLongClick(Editor.java:1205)
at android.widget.TextView.performLongClick(TextView.java:10908)
at android.view.View.performLongClick(View.java:6360)
at android.view.View$CheckForLongPress.run(View.java:24768)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:171)
at android.app.ActivityThread.main(ActivityThread.java:6606)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:518)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
--
Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.widget.Editor$SelectionModifierCursorController.getMinTouchOffset()' on a null object reference
at android.widget.Editor.touchPositionIsInSelection(Editor.java:1084)
at android.widget.Editor.performLongClick(Editor.java:1205)
at android.widget.TextView.performLongClick(TextView.java:10908)
at android.view.View.performLongClick(View.java:6360)
at android.view.View$CheckForLongPress.run(View.java:24768)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:171)
at android.app.ActivityThread.main(ActivityThread.java:6606)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:518)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
#0. Crashed: main
at android.widget.Editor.touchPositionIsInSelection(Editor.java:1084)
at android.widget.Editor.performLongClick(Editor.java:1205)
at android.widget.TextView.performLongClick(TextView.java:10908)
at android.view.View.performLongClick(View.java:6360)
at android.view.View$CheckForLongPress.run(View.java:24768)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:171)
at android.app.ActivityThread.main(ActivityThread.java:6606)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:518)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
类似参考:
https://issuetracker.google.com/issues/37127697
java.lang.NullPointerException with Nougat
也在小米官方论坛上提问http://en.miui.com/forum.php?mod=viewthread&tid=4595164
请尽快提供可行的解决方案。因为用户一定对这些崩溃不满意。
提前致谢。
您的应用中有自定义 TextView
吗?它是否可以调整大小或具有其他功能?
小米的 Android 皮肤可能会干扰它,并导致崩溃。我建议尝试长按您应用中的所有 TextView
。
当用户长按所有选定的文本时会发生这种情况。
只需定义 longClickListener:
edit_text.setOnLongClickListener {
doSomething()
true
}
稍后您可以删除它
edit_text.setOnLongClickListener(null)
对我来说,当 TextView
包含 link 并且为视图调用 setAutoLinkMask(Linkify.ALL);
时,发生了这次崩溃。在这种情况下,Android 处理该视图的所有点击(包括长按)。在其他品牌的设备上长按打开link,但在小米设备上发生崩溃。看起来,他们在 TextView
中处理 onTouchEvent
的逻辑有点不同。我玩了一下发现,在布局文件中为 TextView
设置 android:textIsSelectable="false"
可以解决问题。
我知道,它不是可扩展的解决方案,但对于我来说它是完美的,所以我停止了进一步调查。也许它会给别人一个提示。
1) 首先,仅在需要时设置其中之一。
textView.setMovementMethod(LinkMovementMethod.getInstance());
或
setAutoLinkMask(Linkify.ALL);
或
Linkify.addLinks(textView, Linkify.PHONE_NUMBERS | Linkify.EMAIL_ADDRESSES | Linkify.MAP_ADDRESSES);
2) 其次,为 TextView 设置一个长按监听器,它必须 return true。
textView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
// do soemthing if needed
return true;
}
});
小米设备存在一些内部崩溃问题。如果您首先覆盖 setOnLongClickListener() 然后执行第一步,它将使用内部实现并且会继续崩溃。所以按照以上步骤依次进行是很重要的。
我对其他解决方案持开放态度,但是通过采用这种方法,我再也看不到崩溃报告了。
非常奇怪的小米设备的OS异常。即使我确实有 Fabric 提供的日志,堆栈跟踪也不会引用我的任何代码。
crashalytics(Fabric) 中报告的崩溃详细信息如下,
21K 次崩溃
小米设备全部崩溃
在 Android OS 版本 6、7 和 8
上崩溃
崩溃日志:
# OS Version: 8.1.0
# Device: Redmi Note 5 pro
# RAM Free: 30.1%
# Disk Free: 74.2%
#0. Crashed: main
at android.widget.Editor.touchPositionIsInSelection(Editor.java:1084)
at android.widget.Editor.performLongClick(Editor.java:1205)
at android.widget.TextView.performLongClick(TextView.java:10908)
at android.view.View.performLongClick(View.java:6360)
at android.view.View$CheckForLongPress.run(View.java:24768)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:171)
at android.app.ActivityThread.main(ActivityThread.java:6606)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:518)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
--
Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.widget.Editor$SelectionModifierCursorController.getMinTouchOffset()' on a null object reference
at android.widget.Editor.touchPositionIsInSelection(Editor.java:1084)
at android.widget.Editor.performLongClick(Editor.java:1205)
at android.widget.TextView.performLongClick(TextView.java:10908)
at android.view.View.performLongClick(View.java:6360)
at android.view.View$CheckForLongPress.run(View.java:24768)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:171)
at android.app.ActivityThread.main(ActivityThread.java:6606)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:518)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
#0. Crashed: main
at android.widget.Editor.touchPositionIsInSelection(Editor.java:1084)
at android.widget.Editor.performLongClick(Editor.java:1205)
at android.widget.TextView.performLongClick(TextView.java:10908)
at android.view.View.performLongClick(View.java:6360)
at android.view.View$CheckForLongPress.run(View.java:24768)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:171)
at android.app.ActivityThread.main(ActivityThread.java:6606)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:518)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
类似参考:
https://issuetracker.google.com/issues/37127697
java.lang.NullPointerException with Nougat
也在小米官方论坛上提问http://en.miui.com/forum.php?mod=viewthread&tid=4595164
请尽快提供可行的解决方案。因为用户一定对这些崩溃不满意。
提前致谢。
您的应用中有自定义 TextView
吗?它是否可以调整大小或具有其他功能?
小米的 Android 皮肤可能会干扰它,并导致崩溃。我建议尝试长按您应用中的所有 TextView
。
当用户长按所有选定的文本时会发生这种情况。 只需定义 longClickListener:
edit_text.setOnLongClickListener {
doSomething()
true
}
稍后您可以删除它
edit_text.setOnLongClickListener(null)
对我来说,当 TextView
包含 link 并且为视图调用 setAutoLinkMask(Linkify.ALL);
时,发生了这次崩溃。在这种情况下,Android 处理该视图的所有点击(包括长按)。在其他品牌的设备上长按打开link,但在小米设备上发生崩溃。看起来,他们在 TextView
中处理 onTouchEvent
的逻辑有点不同。我玩了一下发现,在布局文件中为 TextView
设置 android:textIsSelectable="false"
可以解决问题。
我知道,它不是可扩展的解决方案,但对于我来说它是完美的,所以我停止了进一步调查。也许它会给别人一个提示。
1) 首先,仅在需要时设置其中之一。
textView.setMovementMethod(LinkMovementMethod.getInstance());
或
setAutoLinkMask(Linkify.ALL);
或
Linkify.addLinks(textView, Linkify.PHONE_NUMBERS | Linkify.EMAIL_ADDRESSES | Linkify.MAP_ADDRESSES);
2) 其次,为 TextView 设置一个长按监听器,它必须 return true。
textView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
// do soemthing if needed
return true;
}
});
小米设备存在一些内部崩溃问题。如果您首先覆盖 setOnLongClickListener(
我对其他解决方案持开放态度,但是通过采用这种方法,我再也看不到崩溃报告了。