首页 > 解决方案 > java.lang.NullPointerException:尝试调用虚拟方法 android.content.pm.PackageManager android.content.Context.getPackageManager()

问题描述

获取异常“java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'android.content.pm.PackageManager android.content.Context.getPackageManager()'”

当我执行下面的代码时。目标:根据android studio中一种风格的某种状态动态更改图像。

AndroidManifest.xml

 <application
        tools:replace="android:icon,android:roundIcon"
        android:allowBackup="true"
        android:icon="${appIcon}"
        android:label="@string/app_name"
        android:roundIcon="${appIconRound}"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name="devicelist.AddDeviceActivity"/>
        <activity android:name="resourcestatesimulator.NativeActivity" />
        <activity android:name="devicelist.DeviceListActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <activity android:name="CarplayMain" />

        <activity-alias
            android:name=".DeviceListActivityAlias"
            android:enabled="false"
            android:icon="@mipmap/ic_launcher_default"
            android:roundIcon="@mipmap/ic_launcher_default_round"
            android:label="@string/app_name"
            android:targetActivity="devicelist.DeviceListActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity-alias>
    </application>

DeviceListActivity.java

public void defaultIcon()
    {
        Log.i(TAG, "Before default Icon" );
        packageManager = getPackageManager();
        packageManager.setComponentEnabledSetting(new ComponentName(DeviceListActivity.this,"com.bosch.spi.carplay.devicelist.DeviceListActivity"),
                PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                PackageManager.DONT_KILL_APP);

        packageManager.setComponentEnabledSetting(new ComponentName(DeviceListActivity.this,"com.bosch.spi.carplay.devicelist.DeviceListActivityAlias"),
                PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                PackageManager.DONT_KILL_APP);
        Log.i(TAG, "After default Icon" );
    }
    public void activeIcon()
    {
        Log.i(TAG, "Before active Icon" );
        packageManager = getPackageManager();
        packageManager.setComponentEnabledSetting(new ComponentName(DeviceListActivity.this,"com.bosch.spi.carplay.devicelist.DeviceListActivity"),
                PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                PackageManager.DONT_KILL_APP);

        packageManager.setComponentEnabledSetting(new ComponentName(DeviceListActivity.this,"com.bosch.spi.carplay.devicelist.DeviceListActivityAlias"),
                PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                PackageManager.DONT_KILL_APP);
        Log.i(TAG, "After Active Icon" );
    }

在 DeviceListAdapter.java 中调用方法

DeviceListActivity deviceListActivity= new DeviceListActivity();
deviceListActivity.activeIcon();
deviceListActivity.defaultIcon();

标签: android

解决方案


出现问题是因为您尝试手动实例化 Activity DeviceListActivity。当您getPackageManager()DeviceListActivity类中调用方法时,它会抛出 aNullPointerException因为您的活动不是由 Android 管理的,所以它不知道如何为它提供包管理器,因为 Android 运行时甚至不知道您的deviceListActivity,因为您已经用new关键字实例化了它. 不要这样做。你必须让 Android 为你管理你的活动,永远不要用new关键字实例化它。

阅读本文以了解开始活动的正确方法。


推荐阅读