3

私は、PackageManagerインテントフィルタなど)よりも多くの情報を必要とするAndroidアプリケーションを作成しています。 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

関連する問題