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

Android:使用变量调用getLaunchIntentForPackage()时PackageManager空指针异常

问题分析与解决方案

核心问题

你在ReceiveActivity里只声明了private PackageManager packageManager;,但完全没初始化这个对象,导致调用getApplicationIcon()时触发空指针异常——这就是日志里提示的"Attempt to invoke virtual method... on a null object reference"的原因。

修复步骤

1. 初始化PackageManager

在ReceiveActivity的onCreate方法里,setContentView之后添加一行初始化代码:

packageManager = getPackageManager();

2. 额外优化(避免后续崩溃)

  • 处理默认包名:原代码里默认值是"default value",这不是合法包名,需要改成空字符串并添加判断
  • 处理空启动Intent:getLaunchIntentForPackage()可能返回null,必须判断后再启动
  • 异常友好处理:不要直接抛RuntimeException,换成设置默认图标等逻辑

修改后的完整ReceiveActivity代码

public class ReceiveActivity extends AppCompatActivity {

    private ImageButton appDisplay;
    private Drawable icon;
    private PackageManager packageManager;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_receive);

        // 关键:初始化PackageManager
        packageManager = getPackageManager();

        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        // 默认值改成空字符串,方便判断
        String packageNameReceive = sharedPreferences.getString("fabKey", "");

        appDisplay = findViewById(R.id.appDisplay);

        // 只有包名合法时才设置图标和点击事件
        if (!packageNameReceive.isEmpty()) {
            try {
                icon = packageManager.getApplicationIcon(packageNameReceive);
                appDisplay.setBackground(icon);
            } catch (PackageManager.NameNotFoundException e) {
                // 包名无效时显示默认图标
                appDisplay.setBackgroundResource(R.drawable.ic_default_app_icon);
                e.printStackTrace();
            }

            appDisplay.setOnClickListener(v -> {
                Intent appLaunch = packageManager.getLaunchIntentForPackage(packageNameReceive);
                // 检查Intent是否为空,防止崩溃
                if (appLaunch != null) {
                    startActivity(appLaunch);
                }
            });
        } else {
            // 未选中应用时的提示
            appDisplay.setBackgroundResource(R.drawable.ic_no_app_selected);
        }
    }
}

适配Android 11+的额外配置

如果你的应用目标是Android 11及以上版本,需要在AndroidManifest.xml里添加应用查询权限,否则可能获取不到第三方应用信息:

<queries>
    <intent>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent>
</queries>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:57:07