我正在尝试编写一个 Android 2.2 应用程序,它将找到可以移动到 SD 卡的已安装应用程序。执行此操作的权限编码在 AndroidManifest.xml 中文件作为根级属性“android:installLocation”。 PackageInfo似乎对除此属性之外的所有内容都有接口(interface)。我可以打开已安装的 apk 并提取 AndroidManifest.xml 文件,但它似乎是某种二进制编码格式,一些随机的互联网用户为此编写了解码器,但这似乎是一项非常多的工作。
是否有我缺少的界面?
最佳答案
事实证明,虽然没有直接的 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
。那好吧。你明白了。
关于xml - 访问安卓 :installLocation manifest attribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3065219/