Android中getMaximumWindowMetrics()方法引发NoSuchMethodError崩溃的修复方案咨询
解决Android横竖屏切换时的
NoSuchMethodError崩溃问题 问题根源
你遇到的崩溃核心原因很明确:getMaximumWindowMetrics()是Android API Level 30才新增的WindowManager接口方法,但你的项目minSdkVersion设置为19,当App运行在API 30以下的设备上时,系统框架里根本没有这个方法,自然就抛出了java.lang.NoSuchMethodError。
修复方案
我们需要做版本兼容性判断,针对不同API等级的设备使用对应的窗口尺寸获取方式,确保低版本设备也能正常运行。
具体代码修改
把你出错的那段代码替换成以下兼容版本:
import android.os.Build; import android.util.DisplayMetrics; // 其他必要导入... RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) playerView.getLayoutParams(); params.width = RelativeLayout.LayoutParams.MATCH_PARENT; int widthPixels; // 按API版本分支处理 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // API 30及以上设备,使用新的WindowMetrics API WindowMetrics windowMetrics = getWindowManager().getMaximumWindowMetrics(); Rect bounds = windowMetrics.getBounds(); widthPixels = bounds.width(); } else { // API 30以下设备,用传统的DisplayMetrics获取屏幕宽度 DisplayMetrics displayMetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); widthPixels = displayMetrics.widthPixels; } int heightPixels = (widthPixels * 57) / 100; params.height = heightPixels; Log.i("TAG", "onConfigurationChanged: " + widthPixels); playerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FIT);
额外提示
- 如果你的业务需求是获取当前窗口的实际尺寸而非系统最大可用窗口尺寸,在API 30+设备上可以替换为
getCurrentWindowMetrics(),更贴合实际场景。 - 记得确认已经导入
android.os.Build和android.util.DisplayMetrics类,避免编译报错。
内容的提问来源于stack exchange,提问作者MARSH
相关产品推荐
相关产品推荐

