android - 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();
解决方案
出现问题是因为您尝试手动实例化 Activity DeviceListActivity
。当您getPackageManager()
从DeviceListActivity
类中调用方法时,它会抛出 aNullPointerException
因为您的活动不是由 Android 管理的,所以它不知道如何为它提供包管理器,因为 Android 运行时甚至不知道您的deviceListActivity
,因为您已经用new
关键字实例化了它. 不要这样做。你必须让 Android 为你管理你的活动,永远不要用new
关键字实例化它。
阅读本文以了解开始活动的正确方法。
推荐阅读
- c++ - 如何使用信号处理程序来停止和恢复子进程?
- escaping - 如何将热字符串转换为多行文本?
- python - 为什么我不能在画布中设置背景
- python - 如何在 Python 中替换最后一次出现的搜索字符串的一部分
- flutter - Flutter 中的组合框实现?
- apache-kafka - 生产者和消费者的 Kafka Metrics 导出器
- r - 更改 ggcompetingrisks 中的图例标签
- powerbi - 从与 Power BI 中的另一个值相关的记录中获取最短日期
- json - 自定义 Wordpress REST API JSON
- java - 如何将 JSON 对象写入 JAVA 中 JSON 文件中的特定位置