HaM*_*ReD 18 android android-contentprovider
我的清单中有一个ContentProvider,当我使用硬编码字符串完全定义它时,它可以工作.例如
<provider android:name="com.myprovider" android:authorities="com.myprovider"/>
Run Code Online (Sandbox Code Playgroud)
工作完美,但ContentProviders在一个被多个项目使用的库中,我不想要权限冲突,所以我尝试执行以下操作.
<provider android:name="com.myprovider" android:authorities="@string/myProviderAuthority">
Run Code Online (Sandbox Code Playgroud)
这样我就可以在单个strings.xml文件中定义所有权限,并且应用程序之间没有冲突,因为我应该能够使用每个应用程序资源覆盖系统来更改它们.
但是,当我尝试使用@string进行构建时,它似乎给了我一个格式错误的清单错误,并说"提供商没有INCUDE(是的,它说INCUDE)当局致敬"
我是否可以不使用资源字符串为当局致敬,每次我需要在两个位置维护常量时我感到恶心.我们的质量保证部门很难抓住权威冲突,我不希望事情变得不同步或者可能引起混淆.任何人都有任何想法为什么我的代码不工作?
Mic*_*ael 11
我遇到了类似的问题,但有android:versionCode属性.当我尝试在资源中定义版本代码并在清单Android Market中使用它时,甚至禁止我发布应用程序.这种行为的原因变得相当简单.资源可以根据当前配置而改变,并且在任何情况下该值都必须相同.
也许这就是为什么具有权限引用的内容提供者也不起作用的原因.在我看来,使用这样的引用并不是一个好主意,因为不能保证应用程序中的权限资源只有一个值.我知道你可以小心保留这个资源的单个实例,但没有特殊的编译器或系统检查,所以它不能被信任.
许多清单属性不能指定为对字符串的引用 - 它们必须指定为显式字符串值.
解析清单的代码位于: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.
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)
下面列出了PackageParser不允许从资源或不同配置中获取的清单属性.
这些属性在com.android.internal.R.styleable中定义 manifest.xml元素属性名称通常是正式名称中最后一个"_"之后的名称的一部分.例如,manifest.xml中元素中的android:authorities属性是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)
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
因此,manifest.xml文件中的很多属性必须指定为显式字符串值(即引号),而不是对strings.xml中的字符串的引用.
| 归档时间: |
|
| 查看次数: |
5529 次 |
| 最近记录: |