Android4.2系统辅助功能打开时,加载WebView导致空指针异常解决记录

最近负责APP错误统计分析,修复线上一些BUG,有一个这样的问题,日志如下:

java.lang.NullPointerException
    at android.webkit.AccessibilityInjector$TextToSpeechWrapper$1.onInit(AccessibilityInjector.java:753)
    at android.speech.tts.TextToSpeech.dispatchOnInit(TextToSpeech.java:640)
    at android.speech.tts.TextToSpeech.initTts(TextToSpeech.java:619)
    at android.speech.tts.TextToSpeech.<init>(TextToSpeech.java:553)
    at android.webkit.AccessibilityInjector$TextToSpeechWrapper.<init>(AccessibilityInjector.java:676)
    at android.webkit.AccessibilityInjector.addTtsApis(AccessibilityInjector.java:480)
    at android.webkit.AccessibilityInjector.addAccessibilityApisIfNecessary(AccessibilityInjector.java:168)
    at android.webkit.AccessibilityInjector.onPageStarted(AccessibilityInjector.java:340)
    at android.webkit.WebViewClassic.onPageStarted(WebViewClassic.java:4480)
    at android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:366)
    at android.os.Handler.dispatchMessage(Handler.java:107)
    at android.os.Looper.loop(Looper.java:194)
    at android.app.ActivityThread.main(ActivityThread.java:5407)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:525)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
    at dalvik.system.NativeStart.main(Native Method)

发生该错误的机型统计截图如下:

这里写图片描述

如上图所示,都是4.2系统(API 17),那么基本可以确定是系统版本的问题
了。找了一下资料,发现该问题主要是在4.2系统中,当辅助功能打开时,加载WebView会导致空指针异常,我们可以在创建WebView时利用反射强制关闭辅助功能。

修复代码如下:

  /**
     * 关闭辅助功能,针对 Android 4.2 - Jelly Bean 版本
     * java.lang.NullPointerException 
     * at android.webkit.AccessibilityInjector$TextToSpeechWrapper$1.onInit(AccessibilityInjector.java:753) 
     * ... ... 
     */
    private void disableAccessibility(Context context) {  
        if (Build.VERSION.SDK_INT == 17/*4.2 (Build.VERSION_CODES.JELLY_BEAN_MR1)*/) {  
            if (context != null) {  
                try {  
                    AccessibilityManager am = (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);  
                    if (!am.isEnabled()) {  
                        //Not need to disable accessibility  
                        return;  
                    }  

                    Method setState = am.getClass().getDeclaredMethod("setState", int.class);  
                    setState.setAccessible(true);  
                    setState.invoke(am, 0);/**{@link AccessibilityManager#STATE_FLAG_ACCESSIBILITY_ENABLED}*/  
                } catch (Exception ignored) {  

                } catch(Error ignored){  

                }  
            }  
        }  
    }  

猜你喜欢

转载自blog.csdn.net/qq_22393017/article/details/72782801