在ContentProvider中为android:权限使用@string

我在我的清单中有一个ContentProvider,当我用硬编码的string完全定义它们的时候它是有效的。 例如

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

完美的工作,但ContentProviders是在一个库中,由多个项目使用,我不希望权力冲突,所以我试图做到以下几点。

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

这样,我应该能够在一个strings.xml文件中定义我的所有权限,并且不会在应用程序之间产生冲突,因为我应该可以使用每个应用程序资源覆盖系统来更改它们。

但是,似乎当我尝试使用@string构build时,它给了我一个格式错误的错误,并说“提供程序不包含INCUDE(是的,它说INCUDE)当局致敬”

我不能使用资源string为当局致敬,每当我需要在两个地方保持常量,我感到不舒服。 我们的QA部门很难抓住权限冲突,我不想让事情变得不同步,也不会造成混乱。 任何人有任何想法,为什么我的代码不工作?

Solutions Collecting From Web of "在ContentProvider中为android:权限使用@string"

我面临一个类似的问题,但与android:versionCode属性。 当我尝试在资源中定义版本代码,并在清单中使用对它的引用时,Android Market甚至禁止我发布该应用程序。 这种行为的原因相当简单。 资源可以根据当前的configuration而改变,并且这个值在任何情况下都必须是相同的。

可能这就是为什么具有权限引用的内容提供者不能工作的原因。 而且在我看来,使用这样的引用并不是一个好主意,因为不能保证应用程序中的权限资源只有一个值。 我知道你可以小心地保留这个资源的单个实例,但是没有特殊的编译器或者系统检查,所以不能被信任。

许多清单属性不能被指定为对string的引用 – 它们必须被指定为显式string值。

parsing清单的代码位于:frameworks / base / core / java / android / content / pm / PackageParser.java。 该类调用getNonConfigurationString()和getNonResourceString()(它们在:frameworks / base / core / java / android / content / res / TypedArray.java中实现)。

getNonConfigurationString()描述为:

 Retrieve the string value of an attribute that is not allowed to change with the given configurations. 

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不允许从资源或不同configuration获取的清单属性。

这些属性在com.android.internal.R.styleable中定义。manifest.xml元素属性名称通常是正式名称中最后一个“_”后面的名称部分。 例如,manifest.xml中的元素中的android:authority属性是AndroidManifestProvider_authorities或com.android.internal.R.styleable.AndroidManifestProvider_authorities。 (以下属性名称列表中的数字是PackageParser.java 4.1.1版中相关代码的行号)

通过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文件中的许多属性指定为显式string值(即用引号引起来),而不是引用strings.xml中的string。