访问android:installLocation清单属性

wfa*_*ulk 6 xml android android-manifest

我正在尝试编写一个Android 2.2应用程序,它将找到可以移动到SD卡的已安装应用程序.执行此操作的权限在AndroidManifest.xml文件中编码为根级属性" android:installLocation ". PackageInfo似乎有一个除了这个属性的所有东西的接口.我可以打开已安装的apk并解压AndroidManifest.xml文件,但它似乎采用了一些二进制编码格式,一些随机互联网用户已经编写了解码器,但这似乎是一项非常多的工作.

是否有我缺少的界面?

wfa*_*ulk 12

事实证明,虽然没有直接的API调用来获取installLocation,但我也不必手动解析二进制XML,因为提供的XmlResourceParser工作就可以了.

// Experimentally determined
private static final int auto = 0;
private static final int internalOnly = 1;
private static final int preferExternal = 2;

AssetManager am = createPackageContext(packageName, 0).getAssets();
XmlResourceParser xml = am.openXmlResourceParser("AndroidManifest.xml");
int eventType = xml.getEventType();
xmlloop:
while (eventType != XmlPullParser.END_DOCUMENT) {
    switch (eventType) {
        case XmlPullParser.START_TAG:
            if (! xml.getName().matches("manifest")) {
                break xmlloop;
            } else {
                attrloop:
                for (int j = 0; j < xml.getAttributeCount(); j++) {
                    if (xml.getAttributeName(j).matches("installLocation")) {
                        switch (Integer.parseInt(xml.getAttributeValue(j))) {
                            case auto:
                                // Do stuff
                                break;
                            case internalOnly:
                                // Do stuff
                                break;
                            case preferExternal:
                                // Do stuff
                                break;
                            default:
                                // Shouldn't happen
                                // Do stuff
                                break;
                        }
                        break attrloop;
                    }
                }
            }
            break;
        }
        eventType = xml.nextToken();
    }
Run Code Online (Sandbox Code Playgroud)

呃,我想那里switch有一个case应该只是一个if.那好吧.你明白了.