1. 程式人生 > >Android 7.0適配 afinal報錯

Android 7.0適配 afinal報錯

最近專案碰到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(); }