界面Activity中 @Override protected void onCreate(@Nullable Bundle savedInstanceState) { //解决Android 8.0 window透明和固定方向无法共存问题(旋转时发生崩溃问题):方案:优先透明,若windows透明,则不可固定页面方向,且不可设置 if(WindowUtil.setRequestedOrientation(this)){ boolean result = WindowUtil.fixOrienttation(this); Log.e("interative","fixOrienttation , result = "+ result); } super.onCreate(savedInstanceState); }
@Override public void setRequestedOrientation(int requestedOrientation) { //清单文件里面不配置方向 // if(Build.VERSION.SDK_INT == Build.VERSION_CODES.O){ // return; // } //页面设置方向 //windows为透明时,Android 8.0忽略设置方向 if(WindowUtil.setRequestedOrientation(this)){ return; } super.setRequestedOrientation(requestedOrientation); }
工具类
public class WindowUtil { public static boolean setRequestedOrientation(Context context) { if(context == null){ return false; } if(getTargetSDKInt(context) > 29 && Build.VERSION.SDK_INT == Build.VERSION_CODES.O && WindowUtil.isTranslucentOrFloating(context)){ return true; } return false; } private static int getTargetSDKInt(Context context){ int version = 0; PackageManager pm = context.getApplicationContext().getPackageManager(); try { ApplicationInfo applicationInfo = pm.getApplicationInfo(context.getPackageName(),0); if(applicationInfo != null){ version = applicationInfo.targetSdkVersion; } } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } return version; } public static boolean isTranslucentOrFloating(Context context){ boolean isTranslucentOrFloating = false; try { int [] styleableRes = (int[])Class.forName("com.android.internal.R$styleable").getField("Window").get(null); final TypedArray ta = context.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; } //修改屏幕方向为SCREEN_ORIENTATION_UNSPECIFIED public static boolean fixOrienttation(Activity activity){ try { Field field = Activity.class.getDeclaredField("mActivityInfo"); field.setAccessible(true); ActivityInfo o = (ActivityInfo) field.get(activity); //设置屏幕不固定 o.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; field.setAccessible(false); return true; } catch (Exception e) { e.printStackTrace(); } return false; } }