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

Android SDK33下getApplicationInfo废弃方法替代及报错解决

解决getApplicationInfo废弃警告及变量作用域问题

错误原因分析

  1. 变量作用域问题:你在if和else代码块内部声明了ApplicationInfo app,该变量仅在当前代码块内有效,块外的dbx.game_id = ...代码无法访问,因此出现「Cannot resolve symbol 'app'」错误。
  2. Flags参数错误:API33+使用ApplicationInfoFlags时,你传入了0,这会导致无法获取metaData,后续调用app.metaData.getInt()会触发空指针异常。
  3. 类型错误:尝试用PackageItemInfo替代ApplicationInfo,但metaData是ApplicationInfo特有的成员,PackageItemInfo没有该字段,即使初始化也会报错。

正确修改方案

将ApplicationInfo变量声明提升到if/else代码块外部,同时在API33+版本中正确传入对应Flags,保留获取metaData的能力:

@SuppressLint("HardwareIds")
public void initDbx(){
    try {
        ApplicationInfo app;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.TIRAMISU) {
            // API33+ 使用ApplicationInfoFlags,传入GET_META_DATA对应的flags
            app = activity.getPackageManager().getApplicationInfo(
                activity.getPackageName(), 
                PackageManager.ApplicationInfoFlags.of(PackageManager.GET_META_DATA)
            );
        } else {
            // 低版本沿用原有方式
            app = activity.getPackageManager().getApplicationInfo(
                activity.getPackageName(), 
                PackageManager.GET_META_DATA
            );
        }
        
        dbx.game_id      = String.valueOf(app.metaData.getInt("main_id"));
        dbx.game_name    = activity.getResources().getString(R.string.app_name);
        dbx.package_name = activity.getApplication().getPackageName();
        dbx.user_id      = Settings.Secure.getString(activity.getContentResolver(), Settings.Secure.ANDROID_ID);
        dbx.check_net    = isConnectionAvailable();
        //dbx.getUserInfos(activity);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
}

关键说明

  • 作用域修正:将ApplicationInfo app;声明在if/else外部,确保后续代码能访问该变量。
  • Flags参数修正:API33+中使用PackageManager.ApplicationInfoFlags.of(PackageManager.GET_META_DATA)替代原有的PackageManager.GET_META_DATA,保证能正常读取Manifest中的metaData信息。
  • 类型正确匹配:始终使用ApplicationInfo类型,因为getApplicationInfo方法返回的就是该类型,且它包含所需的metaData字段。

内容的提问来源于stack exchange,提问作者Upside-Down

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 06:47:22