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