2011-06-23 41 views
17

當我使用硬編碼字符串完全定義它時,我的清單中有一個ContentProvider。例如。在ContentProvider中對android:authority使用@string

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

運行完美,但是ContentProviders是在被使用的多個項目庫,而我不希望權限衝突,所以我試圖做到以下幾點。

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

這樣,我應該能夠定義一個單一的strings.xml文件,我所有的機構和沒有應用程序之間的衝突,因爲我應該能夠使用每個應用程序的資源覆蓋系統改變它們。

但是,看起來,當我嘗試建立與@string,它給了我一個畸形的明顯錯誤,並說「Provider不INCUDE(是的,它說INCUDE)當局進貢」

我不能用資源字符串爲當局表示敬意,每當我需要在兩個位置保持常量時,我​​感到不適。我們的QA部門很難抓住權限衝突,我不希望事情變得不同步或者可能導致混淆。任何人有任何想法,爲什麼我的代碼不工作?

+1

我剛剛遇到了這個問題,我發現這工作得很好2.2+。當然,如果有人指出如何在2.1和之前的版本中使用它,那將是非常好的。 – dmon

+0

我已經轉移到字符串,但也許你可以使用更新的API作爲構建目標,同時將android:minSdkVersion設置爲7或任何你的目標,類似於將appsToSd編譯成支持2.1的應用程序。 – HaMMeReD

+0

我不認爲這會起作用,因爲它是安裝時抱怨的實際電話,編譯時不會失敗。我最終用Maven替換了「手動」字符串。它很糟糕,但它現在起作用了。我想我可以在2.1到達生命盡頭時將它取回:) – dmon

回答

11

我遇到了類似的問題,但是android:versionCode屬性。當我試圖在資源中定義版本代碼並在清單中使用對它的引用時,Android Market甚至禁止我發佈該應用程序。這種行爲的原因結果相當簡單。資源可以根據當前配置進行更改,並且在任何情況下該值都必須相同。

也許這就是爲什麼具有權限引用的內容提供者不能工作的原因。在我看來,使用這種引用不是一個好主意,因爲不能保證應用中的權限資源只有一個值。我明白你可以小心地保留這個資源的單個實例,但沒有特殊的編譯器或系統檢查,因此它不可信。

+0

這是一個不啓用它的好理由,但它在更高版本中很明顯,只是不是2.1,所以「一致性」不是它不起作用的原因。 – dmon

+0

這只是一個假設。 – Michael

6

許多清單屬性不能被指定爲對字符串的引用 - 它們必須被指定爲顯式字符串值。

解析清單的代碼位於:frameworks/base/core/java/android/content/pm/PackageParser.java。該類調用getNonConfigurationString()和getNonResourceString()(它們在:frameworks/base/core/java/android/content/res/TypedArray.java中實現)。

getNonConfigurationString()描述本身作爲:

​​

getNonResourceString()描述本身作爲:

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不允許從資源或從不同的配置取如下所列。

這些屬性在com.android.internal.R.styleable中定義manifest.xml元素屬性名稱通常是正式名稱中最後一個'_'後的名稱部分。例如,manifest.xml中元素中的android:authority屬性是AndroidManifestProvider_authorities或com.android.internal.R.styleable.AndroidManifestProvider_authorities。 (以下屬性名稱列表中的數字是PackageParser版本4.1.1中相關代碼的行號。JAVA)讀取getNonConfigurationString

屬性:

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) 

屬性由getNonResourceString閱讀:

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的清單中使用顯式字符串,那麼在應用程序中是否可以訪問該字符串,主要是爲了在一個位置定義字符串並在整個字符串中使用一致的字符串? – Les

相關問題