Использование @string для android: полномочия в ContentProvider - PullRequest
18 голосов
/ 24 июня 2011

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

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

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

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

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

Однако, похоже, что когда я пытаюсь собрать с помощью @string, он дает мне некорректную ошибку манифеста и говорит: «Провайдер НЕ ДОПУСКАЕТ (да, он говорит, INCUDE) дань полномочий»

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

Ответы [ 2 ]

11 голосов
/ 13 июля 2011

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

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

7 голосов
/ 03 сентября 2014

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

Код, который анализирует манифест, находится в: 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: полномочия в элементе 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)

Атрибуты прочитаныby 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.

...