访问android:installLocation清单属性

时间:2010-06-17 20:06:08

标签: xml android android-manifest

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

是否有我缺少的界面?

4 个答案:

答案 0 :(得分: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();
    }

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

答案 1 :(得分:0)

考虑到清单标签的所有其他直接属性都可以从PackageInfo中获得,我认为你在那里寻找它是正确的。

我知道它不在文档中,但你还是尝试过吗?像

这样的东西
PackageInfo pkg = ...;
String loc = pkg.installLocation();

我知道这可能是非常幼稚的,因为甚至可能会自动生成文档 - 如果我可以自己尝试,我也不敢提出建议(目前由于延迟操作系统不再受支持而停留在API 7上)

如果它不起作用,我恐怕他们只是忽略了 - 我无法想象他们会突然把它放在别处。在这种情况下,你可能会被困在自己解析清单中。

答案 2 :(得分:0)

在2007年的旧版API中,PackageInfo类中有公共字段,提供有关internalLocation和其他相关信息的所有信息。出于安全考虑,我猜他们已经摆脱了那些方便的领域。

答案 3 :(得分:0)

您可以通过下一个示例访问此属性:

PackageInfo packageInfo = context.getPackageManager().getPackageInfo(mPackageName, 0);
if (packageInfo.installLocation != PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY) {
    .....
}

http://developer.android.com/reference/android/content/pm/PackageInfo.html#installLocation
在API 21中引入

但即使在Android 2.3中也存在此字段 http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3_r1/android/content/pm/PackageInfo.java/