You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android API22真机启动Splash Activity崩溃问题求助

解决API22真机启动Splash崩溃(Resources$NotFoundException)

从崩溃日志可以明确看出,问题出在**@drawable/restaurant资源无法被API22设备识别为Drawable类型**,而模拟器(API版本更高)能正常解析,这通常是低版本Android对Drawable资源的兼容性问题导致的。下面是具体的排查和解决方法:

1. 先确认restaurant资源的类型和位置

首先打开res/drawable/restaurant.xml(或对应分辨率文件夹下的该文件),检查:

  • 如果是矢量图(VectorDrawable):API21+原生支持矢量图,但在XML布局中直接用android:background引用,低版本(甚至部分API21/22设备)会出现识别错误。
  • 如果是自定义Drawable(shape/selector等):检查是否使用了API22以上才支持的属性(比如android:tintMode、android:alpha的某些取值)。
  • 如果是误放的非Drawable资源:比如把布局文件、color资源放在了drawable文件夹下,也会触发这个报错。

2. 针对矢量图资源的兼容方案

如果restaurant是矢量图,按以下步骤处理:

步骤1:配置gradle支持矢量图兼容

在app模块的build.gradle(Module级别)中,添加矢量图支持库配置:

android {
    defaultConfig {
        // 启用矢量图兼容库,让API7+设备支持矢量图
        vectorDrawables.useSupportLibrary = true
    }
}

同步gradle后,继续下一步。

步骤2:替换XML中的背景引用(或用代码设置)

由于低版本Android不支持在XML中直接用android:background引用矢量图,我们可以:

  • 方法A:移除布局中的android:background="@drawable/restaurant",在代码中用兼容方式设置背景:
    在Splash.java的onCreate方法里,setContentView之后添加:
    import android.graphics.drawable.Drawable;
    import android.os.Build;
    import androidx.core.content.res.ResourcesCompat;
    
    // ...
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
    
        // 低版本用兼容方式设置背景
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            Drawable bgDrawable = ResourcesCompat.getDrawable(getResources(), R.drawable.restaurant, null);
            findViewById(android.R.id.content).setBackground(bgDrawable);
        }
    
        // 原有的延迟跳转代码...
    }
    
  • 方法B:将矢量图转换为PNG图片,放在对应分辨率的drawable-hdpi/drawable-xhdpi等文件夹中,替换原矢量图资源。这种方法不需要任何兼容配置,所有版本都能正常识别。

3. 针对自定义Drawable资源的修复

如果restaurant是shape/selector等自定义Drawable:

  • 检查XML中的属性,把API22以上才支持的属性(比如android:tintMode="src_in")移到drawable-v22文件夹下的同名文件中。
  • 低版本使用不包含高版本属性的Drawable文件,放在通用的drawable文件夹中。

4. 排查资源冲突问题

检查所有drawable-*文件夹,确保:

  • 没有重名的非Drawable资源(比如把restaurant.xml布局文件放在drawable文件夹)。
  • 所有版本的Drawable资源类型一致(比如低版本文件夹里不要放color资源代替Drawable)。

按以上步骤排查后,API22真机应该就能正常启动Splash Activity了。

内容的提问来源于stack exchange,提问作者user8990420

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:09:45