3

我正在研究Android应用程序,该应用程序需要比PackageManager中提供的信息更多的信息(例如意图过滤器)。我创建了一个解析器来读取AndroidManifest文件,但是我找不到任何已安装应用程序的位置AndroidManifest.xml。我使用的代码是:如何在不使用PackageManager的情况下阅读Android Manifest?

int flags = PackageManager.GET_ACTIVITIES 
         //| PackageManager.GET_CONFIGURATIONS 
         //| PackageManager.GET_DISABLED_COMPONENTS 
         //| PackageManager.GET_GIDS 
         //| PackageManager.GET_INSTRUMENTATION 
         //| PackageManager.GET_INTENT_FILTERS //Not needed (see BUG: http://code.google.com/p/android/issues/detail?id=3217) 
         | PackageManager.GET_META_DATA 
         | PackageManager.GET_PERMISSIONS 
         | PackageManager.GET_PROVIDERS 
         | PackageManager.GET_RECEIVERS 
         | PackageManager.GET_RESOLVED_FILTER 
         | PackageManager.GET_SERVICES 
         | PackageManager.GET_SHARED_LIBRARY_FILES 
         | PackageManager.GET_SIGNATURES 
         | PackageManager.GET_UNINSTALLED_PACKAGES 
         | PackageManager.GET_URI_PERMISSION_PATTERNS; 
final PackageInfo pkg = pm.getPackageInfo(info.packageName, flags); 
File manifest = new File(pkg.applicationInfo.publicSourceDir + "/AndroidManifest.xml"); 
if (manifest.exists()) { 
    //Code never reaches this point 
} 

根据该文件,ApplicationInfo.publicSourceDir是:

完整路径此 包的公开可用的零件的位置(即初级资源包和清单)。对于 非前向锁定的应用程序,这将与{@link #sourceDir相同。

我在做什么错,或者我该怎么做对吗?

+0

我想这个清单存储在dex档案中。你可以看到'pkg.applicationInfo.publicSourceDir'中有哪些文件? – Jin35

+0

@ Jin35,当我做了'new File(pkg.applicationInfo.publicSourceDir).list()'时,它返回null。 – Phil

回答

0

花了很长时间,但我明白了。资产(如清单)被压缩 - 请参阅this post。如果它没有被压缩,@gwa(或类似的东西)提供的代码就可以实现这个功能。

0

我不认为你的应用程序有足够的特权来阅读它。在根植设备上试用它。

0

下面的代码:

AssetManager am = yourContext.createPackageContext("packageName", 0).getAssets(); 

XmlResourceParser xml = am.openXmlResourceParser("AndroidManifest.xml"); 

但你需要解析它。

+0

这不适合我。你在上下文中是否有这个代码的例子? – Phil

+0

我在我的应用程序中使用此代码来读取'installLocation'属性,它运行良好。你会怎么样? – gwa

+0

我得到一个'FileNotFoundException',这很奇怪,因为'am.list()'显示* AndroidManifest.xml *以及其他一些资产。 – Phil

相关问题