Android SDK33下getApplicationInfo废弃方法替代及报错解决
解决getApplicationInfo废弃警告及变量作用域问题
错误原因分析
- 变量作用域问题:你在
if和else代码块内部声明了ApplicationInfo app,该变量仅在当前代码块内有效,块外的dbx.game_id = ...代码无法访问,因此出现「Cannot resolve symbol 'app'」错误。 - Flags参数错误:API33+使用
ApplicationInfoFlags时,你传入了0,这会导致无法获取metaData,后续调用app.metaData.getInt()会触发空指针异常。 - 类型错误:尝试用
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
相关产品推荐
相关产品推荐

