Подтвердить что ты не робот

Использование @string для android: полномочия в ContentProvider

У меня есть ContentProvider в моем манифесте, когда я определяю их полностью с жестко закодированными строками, он работает. Например.

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

Работает отлично, однако ContentProviders находятся в библиотеке, которая используется несколькими проектами, и я не хочу конфликтов полномочий, поэтому я попытался сделать следующее.

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

Таким образом, я должен иметь возможность определять все мои полномочия в одном файле strings.xml и не иметь конфликтов между приложениями, так как я должен иметь возможность изменять их, используя систему переопределения ресурсов приложений.

Однако, похоже, что когда я пытаюсь построить с помощью @string, он дает мне неправильную ошибку манифеста и говорит: "Поставщик не делает INCUDE (да, это говорит INCUDE) данью власти"

Могу ли я использовать строку ресурсов для дань власти, я чувствую себя больным каждый раз, когда мне нужно поддерживать константы в двух местах. Конфликты с полномочиями могут быть трудно уловить наш отдел QA, и я не хочу, чтобы что-то не синхронизировалось, или это может вызвать путаницу. У кого-нибудь есть идеи, почему мой код не работает?

4b9b3361

Ответ 1

Я столкнулся с аналогичной проблемой, но с атрибутом android:versionCode. Когда я пытался определить код версии в ресурсах и использовать ссылку на него в манифесте Android Market, даже запретил мне публиковать приложение. Причина такого поведения оказалась довольно простой. Ресурсы могут меняться в зависимости от текущей конфигурации, и это значение должно быть одинаковым в любом случае.

Вероятно, это причина, по которой контент-провайдеры со ссылками на источники не работают. И мне кажется, что не рекомендуется использовать такую ​​ссылку, потому что нет гарантии, что единственное значение для ресурса полномочий в приложении. Я понимаю, что вы можете быть достаточно осторожны, чтобы сохранить один экземпляр этого ресурса, но нет специального компилятора или системы для этого, поэтому ему нельзя доверять.

Ответ 2

Многие атрибуты манифеста не могут быть указаны как ссылка на строку - они должны быть указаны как явные строковые значения.

Код, анализирующий манифест, находится в: 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 не позволяет извлекать из ресурсов или из разных конфигураций.

Эти атрибуты определены в com.android.internal.R.styleable Имя атрибута элемента manifest.xml обычно является частью имени после последнего '_' в формальном имени. Например, атрибут android: authority в элементе в manifest.xml является AndroidManifestProvider_authorities или com.android.internal.R.styleable.AndroidManifestProvider_authorities. (Число в списках имен атрибутов ниже - номер строки соответствующего кода в версии 4.1.1 PackageParser.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.