2016-07-07 1 views
5

У меня возникла следующая проблема: Приложение, которое я реализовал, включает другой проект как зависимость (типа aar). Оба проекта имеют один и тот же родительский pom. Зависимость включает ресурсы, которые приложение использует. Чтобы получить доступ к ресурсам в рамках проекта библиотеки, идентификатор ресурса выбирается путем вызова context.getResources().getIdentifier(resourceKey, resourceType, packageName). Я получаю имя пакета, вызывая getPackageName() по данному объекту context. Перед изменением названия пакетов из проектов с использованием

<renameManifestPackage>com.example.newpackagename</renameManifestPackage> 

доступ к ресурсам библиотеки работали нормально. Но после переименования имени пакета приложения я получаю android.content.res.Resources$NotFoundException, потому что вызов getIdentifier() по-прежнему ожидает старое имя пакета приложения, а вызов getPackageName() возвращает новый (как и ожидалось).
Теперь я задаюсь вопросом, не пропал ли я что-то или если это ошибка в плагине Android?

ответ

2

Ответ: Я что-то пропустил. Я открыл билет на эту проблему на сайте проекта (https://github.com/simpligility/android-maven-plugin/issues/736). Оказалось, что то, что я видел как проблему, - это ожидаемое поведение конфигурации renameManifestPackage, поскольку переименование не только пакета манифеста, но и ресурсов выходит за рамки этой конфигурации.

Там, однако, не слишком некрасиво обходной путь для этого:

Вместо получения имени пакета из Context объекта, можно извлечь его из Resources объекта. А вот та часть, где он получает немного некрасиво: Ресурс с единственной целью извлечения имени пакета должен быть добавлен, поскольку другие ресурсы обычно предметы для изменения:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <!-- The only purpose of this resource is to retrieve the resource package name --> 
    <item name="used_for_package_name_retrieval" type="id"/> 
</resources> 

Теперь вы можете получить имя пакета ресурсов следующим образом:

Resources resources = context.getResources(); 
String packageName = resources.getResourcePackageName(R.id.used_for_package_name_retrieval); 

Заслуга: http://www.piwai.info/renaming-android-manifest-package/

Смежные вопросы