Установка android:versionName в качестве ссылки на строковый ресурс приводит к исключению NullPointerException в эмуляторе.

Я пытаюсь установить android:versionName в своем манифесте Android как ссылку на строковый ресурс, хранящийся во внешнем файле ресурсов.

Ниже приведен отрывок из моего AndroidManifest.xml:

<manifest
  xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.toycorporation"
  android:versionCode="@integer/version_code"
  android:versionName="@string/version_name"
>

и содержимое файла build.xml, расположенного в каталоге res/values моего проекта:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
  <item type="string" name="build_date">03/15/2012</item>
  <item type="integer" name="version_code">315281</item>
  <item type="string" name="version_name">3.15.28.1</item>                 
</resources>

Позже я пытаюсь получить номер версии, чтобы отобразить его на экране «О программе» моего приложения.

PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(),0);
Log.d("PackageInfo", "Version name: " + String.valueOf(packageInfo.versionName));

Описание проблемы:

Когда я создаю приложение и автоматически устанавливаю его на свое устройство HTC, все работает идеально. Имя версии передается по ссылке, и на экране «О программе» я получаю значение имени версии, зарегистрированное в logcat. Но когда я пытаюсь собрать приложение и запустить его на эмуляторе, я получаю null вместо значения имени версии.

Я уже пытался собрать и установить приложение на эмулятор с помощью Eclipse и IDEA. Так что похоже проблема не в IDE.

ОБНОВЛЕНИЕ:

Появилась еще одна вещь, которая не работает при таком использовании versionName и versionCode. Приложение не может быть развернуто в Google Play. Появляется следующая ошибка:

Файл недействителен: ОШИБКА при получении атрибута «android: versionCode»: атрибут не является целочисленным значением.


person Vladimir Kosinets    schedule 15.03.2012    source источник
comment
работает ли использование <string name="version_name">3.15.28.1</string>?   -  person Alex Curran    schedule 15.03.2012
comment
Нет, это не так. Я только что попытался добавить простой строковый ресурс в strings.xml и использовать ссылку на него в AndroidManifest.xml, как посоветовал @Espiandev. Все равно не повезло.   -  person Vladimir Kosinets    schedule 15.03.2012
comment
Дубликат stackoverflow. ком/вопросы/6018079/   -  person Kristopher Johnson    schedule 26.06.2012


Ответы (3)


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

1.) если вы можете скомпилировать и загрузить APK на рынок Android и использовать правильный номер версии и имя, вы можете использовать ссылки на ресурсы для android:versionCode="@integer/version_code" android:versionName="@ строка/имя_версии"

Если вы не можете, вы не должны использовать референсы.

2.) Если вы собираетесь использовать этот подход, зачем тогда пытаться получить их из информации о пакете, а не с помощью getResources().getString(R.string.version_name)?

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

person Matt Gaunt    schedule 20.03.2012
comment
Единственной целью использования ссылок в файле манифеста было перемещение всех значений, связанных со сборкой (таких как имя версии, код версии, дата сборки) в отдельный XML-файл, что упрощает для сценария сборки изменение этих значений в одном месте. - person Vladimir Kosinets; 22.03.2012

Вы можете указать versionName в манифесте как ссылку на строковый ресурс, но не versionCode.

person Konpon96    schedule 06.07.2013

Это должно работать. в размеры.xml добавьте следующее.

<resources>
     <item name="version_number" format="float" type="dimen">2.8</item>
     <item name="version_code" format="integer" type="dimen">8</item>
</resources>

В манифесте добавьте следующее.

    android:versionCode="@dimen/version_code"
    android:versionName="@dimen/version_number" 
person sirFunkenstine    schedule 09.05.2014