大家都知道WebView的使用很简单。但是它在系统权限的应用里刚加载时就突然报错了。解决办法如下:
//如果WebView放在布局中,必须要放在setContentView之前
private void hookWebView(){
Class<?> factoryClass = null;
try {
factoryClass = Class.forName("android.webkit.WebViewFactory");
Method getProviderClassMethod = null;
Object sProviderInstance = null;
if (Build.VERSION.SDK_INT == 23) {
getProviderClassMethod = factoryClass.getDeclaredMethod("getProviderClass");
getProviderClassMethod.setAccessible(true);
Class<?> providerClass = (Class<?>) getProviderClassMethod.invoke(factoryClass);
Class<?> delegateClass = Class.forName("android.webkit.WebViewDelegate");
Constructor<?> constructor = providerClass.getConstructor(delegateClass);
if (constructor != null) {
constructor.setAccessible(true);
Constructor<?> constructor2 = delegateClass.getDeclaredConstructor();
constructor2.setAccessible(true);
sProviderInstance = constructor.newInstance(constructor2.newInstance());
}
} else if (Build.VERSION.SDK_INT == 22) {
getProviderClassMethod = factoryClass.getDeclaredMethod("getFactoryClass");
getProviderClassMethod.setAccessible(true);
Class<?> providerClass = (Class<?>) getProviderClassMethod.invoke(factoryClass);
Class<?> delegateClass = Class.forName("android.webkit.WebViewDelegate");
Constructor<?> constructor = providerClass.getConstructor(delegateClass);
if (constructor != null) {
constructor.setAccessible(true);
Constructor<?> constructor2 = delegateClass.getDeclaredConstructor();
constructor2.setAccessible(true);
sProviderInstance = constructor.newInstance(constructor2.newInstance());
}
} else if (Build.VERSION.SDK_INT == 21) {//Android 21无WebView安全限制
getProviderClassMethod = factoryClass.getDeclaredMethod("getFactoryClass");
getProviderClassMethod.setAccessible(true);
Class<?> providerClass = (Class<?>) getProviderClassMethod.invoke(factoryClass);
sProviderInstance = providerClass.newInstance();
}
if (sProviderInstance != null) {
Log.i("cym", sProviderInstance.toString());
Field field = factoryClass.getDeclaredField("sProviderInstance");
field.setAccessible(true);
field.set("sProviderInstance", sProviderInstance);
}
} catch (Exception e) {
e.printStackTrace();
}
}