2011-06-23 5 views
17

私はマニフェストにContentProviderを持っています。例えば。完璧な作品ContentProviderのandroid:authoritiesに@stringを使用する

<provider android:name="com.myprovider" android:authorities="com.myprovider"/> 
は、しかしContentProvidersは、複数のプロジェクトで使用されますライブラリにある、と私は権威の競合をしたくないので、私は次の操作を実行しようとしました。私は、単一のstrings.xmlファイル内のすべての私の権限を定義することができると私は、各アプリケーションのリソース・オーバーライド・システムを使用してそれらを変更することができるはずですので、アプリケーション間の競合を持つべきではない

<provider android:name="com.myprovider" android:authorities="@string/myProviderAuthority"> 

この方法です。

しかし、それは私が@stringでビルドしようとすると、それは私に不正な形式のマニフェストエラーを与えると言うことが表示されます

私が使用できない「プロバイダがINCUDEしない当局トリビュート(はい、それはINCUDEは言います)」私は2つの場所で定数を維持する必要があるたびにうんざりしています。権限紛争は私たちのQA部門によって奪取するのが難しく、私は物事が同期しないようにしたり、混乱を招くことはありません。誰も私のコードがうまくいかない理由を知りましたか?

+1

私はちょうどこの問題に直面しました。もちろん、誰かが2.1以前でこれを動作させる方法を指摘すれば、素晴らしいことでしょう。 – dmon

+0

私は文字列に移動しましたが、もっと新しいAPIをビルドターゲットとして使用して、アンドロイド:minSdkVersionを7に設定するか、targetTargetを何に設定しても、appsToSdを2.1をサポートするアプリケーションにコンパイルするのと同様です。 – HaMMeReD

+0

私はそれが動作するとは思えません。実際の電話はインストール時に文句を言うので、コンパイルすると失敗しません。私は文字列をMavenで "手動で"置き換えることになりました。それは吸うが、それは今のところうまくいく。 2.1が終わると、私はそれを取り戻すことができると思います:) – dmon

答えて

11

私は同様の問題に直面したが、android:versionCode属性を持ちます。私がリソースにバージョンコードを定義しようとしたときに、マニフェストのAndroidマーケットでバージョンコードを参照しても、私がアプリケーションを公開することを禁じていました。このような挙動の理由はかなり単純であることが判明した。リソースは現在の構成に応じて変更することができ、この値はいずれの場合も同じでなければなりません。

おそらく、これは権限の参照とコンテンツプロバイダが、あまりにも動作しない理由です。そのような参照を使用することは良い考えではないように思えます。なぜなら、アプリケーションに権限リソースの唯一の値があるという保証はないからです。私はあなたがこのリソースの単一のインスタンスを保持するのに十分な注意を払うことができることを理解していますが、特別なコンパイラやシステムチェックがないので、信頼できません。

+0

これはこれを有効にしないのがよい理由ですが、それは2.1以降のバージョンではっきりと動作するため、「一貫性」が原因ではありません。 – dmon

+0

それはちょうど前提でした。 – Michael

6

多くのマニフェストの属性は、文字列への参照として指定することはできません - 彼らは、明示的な文字列値として指定する必要があります。フレームワーク/ベース/コア/ジャワ/アンドロイド/コンテンツ/ PM/PackageParser.java:マニフェストを解析

コードはです。このクラスは、とりわけgetNonConfigurationString()とgetNonResourceString()(frameworks/base/core/java/android/content/res/TypedArray.javaで実装されています)を呼び出します。

getNonConfigurationString()として自身を説明:

Retrieve the string value for an attribute, but only if that string comes from an immediate value in an XML file. That is, this does not allow references to string resources, string attributes, or conversions from other types. As such, this method will only return strings that come from attributes in an XML file. 

PackageParserリソースから、または異なる構成から採取されることを可能にしないマニフェスト属性:

​​

getNonResourceStringは()としての地位を説明します以下にリストされています。

これらの属性は、正式名称に「_」のmanifest.xml要素は、名前は通常、最後の後の名前の一部である属性com.android.internal.R.styleableで定義されています。たとえば、manifest.xmlの要素のandroid:authorities属性は、AndroidManifestProvider_authoritiesまたはcom.android.internal.R.styleable.AndroidManifestProvider_authoritiesです。 (以下の属性名のリスト中の数字は、PackageParserのバージョン4.1.1の関連するコードの行番号です。Java)のgetNonConfigurationStringで読み取る

属性:getNonResourceStringで読み取り

917: AndroidManifest_versionName 
922: AndroidManifest_sharedUserId 
2057: AndroidManifestActivity_parentActivityName 
2071: AndroidManifestActivity_permission 
2079: AndroidManifestActivity_taskAffinity 
2247: AndroidManifestActivityAlias_targetActivity 
2330: AndroidManifestActivityAlias_permission 
2336: AndroidManifestActivityAlias_parentActivityName 
1672: AndroidManifestApplication_name 
1683: AndroidManifestApplication_manageSpaceActivity 
1697: AndroidManifestApplication_backupAgent 
1795: AndroidManifestApplication_permission 
1800: AndroidManifestApplication_taskAffinity 
1815: AndroidManifestApplication_process 
3005: AndroidManifestData_mimeType 
3017: AndroidManifestData_scheme 
3023: AndroidManifestData_host 
3025: AndroidManifestData_port 
3031: AndroidManifestData_path 
3037: AndroidManifestData_pathPrefix 
3043: AndroidManifestData_pathPattern 
2527: AndroidManifestGrantUriPermission_path 
2533: AndroidManifestGrantUriPermission_pathPrefix 
2539: AndroidManifestGrantUriPermission_pathPattern 
2579: AndroidManifestPathPermission_permission 
2581: AndroidManifestPathPermission_readPermission 
2586: AndroidManifestPathPermission_writePermission 
2615: AndroidManifestPathPermission_path 
2622: AndroidManifestPathPermission_pathPrefix 
2629: AndroidManifestPathPermission_pathPattern 
2434: AndroidManifestProvider_authorities 
2441: AndroidManifestProvider_permission 
2443: AndroidManifestProvider_readPermission 
2454: AndroidManifestProvider_writePermission 
2713: AndroidManifestService_permission 
2832: AndroidManifestMetaData_name 
1225: AndroidManifestOriginalPackage_name 
1981: (parsePackageItemInfo -- I can't tell list of all names) 
3258: (Component constructor args.nameres -- I can't tell list of all names) 

属性:

1806: AndroidManifestApplication_taskAffinity 
1821: AndroidManifestApplication_process 
1632: AndroidManifestInstrumentation_targetPackage 
2891: AndroidManifestPackageVerifier_name 
2894: AndroidManifestPackageVerifier_publicKey 
1512: AndroidManifestPermission_permissionGroup 
1200: AndroidManifestProtectedBroadcast_name 
1927: AndroidManifestUsesLibrary_name 
1054: AndroidManifestUsesFeature_name 
1004: AndroidManifestUsesPermission_name 
3308: (Component constructor args.processRes -- I can't tell list of all names) 

ので、Manifest.xmlファイル内の属性の多くは、明示的な文字列値として指定する必要があります(つまり、引用符で囲んで)、strings.xml内の文字列への参照ではありません。

+0

私はそれを手に入れます。デザインによっては、特定の場合にリソース文字列を使用することができません。 AndroidManifestProvider_authoritiesのマニフェストで明示的な文字列を使用している場合、主に1つの場所で文字列を定義し、一貫した文字列を使用するために、その文字列にアクセスできる方法がありますか? – Les

関連する問題