Android 7.0適配 afinal報錯
阿新 • • 發佈:2019-02-07
最近專案碰到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();
}