我正在尝试编写一个Android 2.2应用程序,它将找到可以移动到SD卡的已安装应用程序.执行此操作的权限在
AndroidManifest.xml文件中编码为根级别属性“
android:installLocation”.
PackageInfo似乎有一个除了这个属性的所有东西的接口.我可以打开已安装的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(); }
呃,我想那里有一个开关,有一个应该只是一个if.好吧.你明白了.