android 4.4以下loadIocn nullpointerException问题

原创 2015年11月19日 18:38:22

之前一直没注意,今天有同学跟我说在oppo n1手机上获取apk安装包时会崩溃,看到的崩溃信息是

java.lang.NullPointerException
    at android.app.ActivityThread$ResourcesKey.<init>(ActivityThread.java:2200)
    at android.app.ActivityThread.getTopLevelResources(ActivityThread.java:187)
    at android.app.ActivityThread.getTopLevelResources(ActivityThread.java:246)
    at android.app.ContextImpl$ApplicationPackageManager.getResourcesForApplication(ContextImpl.java:2188)
    at android.app.ContextImpl$ApplicationPackageManager.getDrawable(ContextImpl.java:2114)
    at android.content.pm.PackageItemInfo.loadIcon(PackageItemInfo.java:131)
    at android.app.ContextImpl$ApplicationPackageManager.getApplicationIcon(ContextImpl.java:2169)
    at com.metago.astro.IconManager.loadPackageIcon(IconManager.java:330)

从异常信息可以看出是在ResourcesKey的构造时崩溃的。找到4.2的该类定义

    ResourcesKey(String resDir, int displayId, Configuration overrideConfiguration, float scale) {
1516            mResDir = resDir;
1517            mDisplayId = displayId;
1518            if (overrideConfiguration != null) {
1519                if (Configuration.EMPTY.equals(overrideConfiguration)) {
1520                    overrideConfiguration = null;
1521                }
1522            }
1523            mOverrideConfiguration = overrideConfiguration;
1524            mScale = scale;
1525            int hash = 17;
1526            hash = 31 * hash + mResDir.hashCode();
1527            hash = 31 * hash + mDisplayId;
1528            hash = 31 * hash + (mOverrideConfiguration != null
1529                    ? mOverrideConfiguration.hashCode() : 0);
1530            hash = 31 * hash + Float.floatToIntBits(mScale);
1531            mHash = hash;

可以看到类在构造时没有对resDir进行校验,在第1526行引用时就可能报空指针问题
而我一直使用的note3并未出现此问题,于是再看到4.4上这个类的定义

31    public More ...ResourcesKey(String resDir, int displayId, Configuration overrideConfiguration,
32            float scale, IBinder token) {
33        mResDir = resDir;
34        mDisplayId = displayId;
35        if (overrideConfiguration != null) {
36            mOverrideConfiguration.setTo(overrideConfiguration);
37        }
38        mScale = scale;
39        mToken = token;
40
41        int hash = 17;
42        hash = 31 * hash + (mResDir == null ? 0 : mResDir.hashCode());
43        hash = 31 * hash + mDisplayId;
44        hash = 31 * hash + (mOverrideConfiguration != null
45                ? mOverrideConfiguration.hashCode() : 0);
46        hash = 31 * hash + Float.floatToIntBits(mScale);
47        mHash = hash;
48    }

看到4.4中的42行在引用时进行了判空,所以并没有崩溃。这种情况下获取到的icon都是默认的,也就是安卓那个小绿机器人。
解决这个问题的办法是在获取了apk安装包的applicationInfo后,

applicationInfo.sourceDir = "apkpath";
applicationInfo.publicSourceDir = "apkpath";

把这apk的路径赋予这两个值任意之一就行,因为从activityThread.java可以看到,resDir取的就是sourceDir和publicSourceDir之一。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

关于Android4.4及以下版本,TextView中使用矢量图时报错的问题

问题描述:在新项目的“我的”模块部分,每个条目左边是图片,图片右边是文字,然后条目末端是个向右的箭头,这个很常见,我是使用一个TextView来时实现的,由于UI那边没有切好左边的图,所以我这边在An...

Android 4.4 kitkat以上及以下根据uri获取路径的方法

原址:http://www.2cto.com/kf/201502/376975.html 今天我在做视频编辑的时候,遇到了这个问题,前后用了1个小时来发现并解决了这个问题,因为我一直认为是我...

Android短信拦截机制适配的坑(上)--4.4以下系统

最近项目遇到短信拦截的问题,新短信到达以后,项目app希望可以提示用户未读短信的数据,并且可以将短信置为已读。 这个可能在不同系统中都遇到了问题,并且和其他短信访问的app,例如微信电话本发生冲突,下...

Android-WebView4.4以下兼容

App开发时或多或少加载web页面,但是使用h5或者一些新特性来写的web页在Android低版本系统上经常出现各种兼容适配问题App开发时或多或少加载web页面,但是使用h5或者一些新特性来写的we...

Android 4.4以下ListView addHeader和addFooter放在setAdapter之后导致异常的原因分析和解决

问题重现: 在Android 19之前,ListView的addHeader和addFooter必须在setAdapter之前调用,否则就会有异常,Android 19以及之后是没有这个问题的。异常...

Android 4.4 kitkat以上及以下根据uri获取路径的方法

这里先看下4.4之前的uri的形式:Uri : content://media/extenral/images/media/17766 是不是很熟悉?再看4.4及以后的Uri形式:content:/...

Android 4.4 kitkat以上及以下根据uri获取路径的方法

今天我在做视频编辑的时候,遇到了这个问题,前后用了1个小时来发现并解决了这个问题,因为我一直认为是我记错了,后来发现,华为P6用的是Android4.4系统,然后我就恍然了。。。 首先说说我在做...

nfc读卡在android 4.4以上与4.4以下写法的区别

nfc读卡本来在android4.1读写很正常,在4.4就出现莫名其妙的错误,搞了好久,终于有点眉目。 http://stackoverflow.com/questions/23815555/is-...
  • ydpzg
  • ydpzg
  • 2014-12-22 21:36
  • 3265

<Opencv for Android 调试>加载XML模型,使用SVM.predict出现的NullPointerException问题

在做使用SVM进行检测识别的例子,其中运行的时候出现了这个错误。因为读文件和初始化是参照网上银行卡号识别例子中的cascade分类器的例子自己改的,估计是这边出了问题,当时报错是: java.lang...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)