最近项目碰到7.0版本运行直接闪退
错误日志如下
com.android.internal.policy.DecorContext cast to activity
通过打印日志和查看源码得知
net.tsz.afinal.AFinalUIHelper.initView(View view){
...
Activity activity =(Activity) view.getContext();//23行
...
}
分析日志
// 7.0版本 view.getContext().getClass()=com.android.internal.policy.DecorContext
// 5.0版本 view.getContext().getClass()=com.android.internal.policy.impl.PhoneWindow$DecorView
修改代码
通过错误日志分析DecorContext不能转换成activity
需要通过反射DecorContext的mPhoneWindow然后再反射里面context得到
在7.0之前直接取就行了 activity = (Activity) view.getContext();
if(view.getContext().getClass().getName().contains("com.android.internal.policy.DecorContext")){
try{
Field field=view.getContext().getClass().getDeclaredField("mPhoneWindow");
field.setAccessible(true);
Object obj=field.get(view.getContext());
java.lang.reflect.Method m1 = obj.getClass().getMethod("getContext");
activity=(Activity) (m1.invoke(obj));
// Log.d("DebugTools", m1.invoke(obj).getClass().getName());
fields = activity.getClass().getDeclaredFields();
// for(Field dd:fields){
// Log.d("DebugTools","-"+ dd.getName());
// }
}catch(Exception ee){
Log.e("DebugTools", "",ee);
}
}else{
activity = (Activity) view.getContext();
}
附上源码DecorContext源码查看