华为Aandroid8.0手机

Log 如下:

java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation

解决办法:
在 BaseActivity 中的 onCreate 方法进行处理

@Override
protected void onCreate(Bundle savedInstanceState) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && UiUtils.isTranslucentOrFloating(this)) {
        UiUtils.fixOrientation(this);
        KLog.debug("api 26 全屏横竖屏切换 crash");
    }
    super.onCreate(savedInstanceState);
    ......
}

在 BaseActivity 的 setRequestedOrientation 方法中进行处理

@Override
public void setRequestedOrientation(int requestedOrientation) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && UiUtils.isTranslucentOrFloating(this)) {
        KLog.debug("api 26 全屏横竖屏切换 crash");
        return;
    }
    super.setRequestedOrientation(requestedOrientation);
}

UiUtils 工具类:

 /**
 * 针对 Android 27 的情况进行处理
 * 横竖屏设置了方向会崩溃的问题
 *
 * @return
 */
public static boolean isTranslucentOrFloating(Activity activity) {
    boolean isTranslucentOrFloating = false;
    try {
        int[] styleableRes = (int[]) Class.forName("com.android.internal.R$styleable").getField("Window").get(null);
        TypedArray ta = activity.obtainStyledAttributes(styleableRes);
        Method m = ActivityInfo.class.getMethod("isTranslucentOrFloating", TypedArray.class);
        m.setAccessible(true);
        isTranslucentOrFloating = (boolean)m.invoke(null, ta);
        m.setAccessible(false);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return isTranslucentOrFloating;
}

/**
 * 修复横竖屏 crash 的问题
 * @return
 */
public static boolean fixOrientation(Activity activity){
    try {
        Field field = Activity.class.getDeclaredField("mActivityInfo");
        field.setAccessible(true);
        ActivityInfo o = (ActivityInfo)field.get(activity);
        o.screenOrientation = -1;
        field.setAccessible(false);
        return true;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return false;
}

你可能感兴趣的:(华为Aandroid8.0手机)