2012-02-27 3 views
27

Я получаю отчеты о сбоях из Android Маркета:Ресурсы NotFoundException?

android.content.res.Resources$NotFoundException: Resource ID #0x.... 

я получаю около 17 из них в неделю. Это указывает на следующее в моем коде:

context.getResources().getDrawable(R.drawable.foo); 

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

Благодаря

--------- Обновление ----------------------

Также я могу видеть вход для Drawable в вопросе в моем файле R.java, выглядит следующим образом:

public static final int foo=0x7f020034; 

я чистая сборка проекта, то сразу после этого сделать свой релиз сборки (без изменения коды между не дать автоматическое eclipse build stuff, возможно, приведет к ошибке файла R)

Спасибо

+0

Это может быть очевидно, но есть ли у вас проверка «Build Automatically» в Eclipse? Если вы не используете Eclipse, обновили ли вы классы ресурсов после их изменения? Можете ли вы показать нам свой класс R? – m0skit0

+0

Привет, да, у меня есть «сборка автоматически», но я делаю чистую сборку перед каждой версией. Я могу видеть, что запись ресурса присутствует для того, что можно сделать в R.java (вставлено выше). Спасибо – user291701

+0

Я ничего не вижу вставкой, но если вы говорите, что запись там ... Является ли пакет, показанный в R правильным (то же самое, что и вашей деятельности)? – m0skit0

ответ

10

Это отчеты о сбоях, исходящие от версии < = 1.6, и у вас есть определенные ресурсы только в квалифицированных папках, то есть "drawable-mdpi" вместо "drawable"? Если это так, прочитайте о «Известных проблемах» внизу this page.

+0

Ah dang У меня есть некоторые ресурсы в/drawable-mdpi, а другие просто в/drawable. Я уже некоторое время запускал это на эмуляторе 1.6, и у меня никогда не было никаких проблем (моя минимальная цель - 1,6, поэтому пользователи не могут даже работать на 1.5). Может ли это так? Разве это не должно быть сбой на эмуляторе? – user291701

+0

Да, он должен сработать и на эмуляторе. Я сам использую эмулятор 1.6, чтобы отслеживать такие ошибки. Если вы тщательно протестировали эмулятор, вы можете исключить эту ошибку:/ – pgsandstrom

+0

Хм, да, на самом деле я вижу теперь, что на рынке говорят, что эта ошибка происходит на Nexus One, Droid, а затем на других. Я думаю, что Nexus One работает минимум 2.0, то же самое для Droid. Argh. – user291701

2

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

шаги, которые я последовал являются

  1. Удалить папку бен это сам
  2. Чистый проект
  3. удалить приложение с устройства
  4. Запустите приложение и проверьте сценарий.

По моему мнению, это не должно повторять это исключение.

Причина: Когда вы создаете приложение R.java содержит весь адрес памяти, и бывает так, что этот адрес недействителен для следующего запуска.

2 Причина: Если у вас есть приложение, поддерживающее режим lanscape и portrati, и если вы не написали XML-файл для любого из них, это может привести к такому краху. и есть много шансов на проблемы с OutoFmemory и Memory, когда вы должны поддерживать оба режима. подумайте об этом.

+0

Для меня все равно - это не полезно. Я получаю эти отчеты о сбоях из живых проектов в магазине приложений. Я никогда не видел этого во время тестирования или собственного использования живой версии с использованием различных устройств (которые являются теми же устройствами/os, что и некоторые из отправляемых им отчетов). Это не похоже на один конкретный ресурс/адрес - для меня - поскольку я видел отчеты о сбоях при получении всех ресурсов - может ли это быть вызвано тем, что ОС выбрасывает исключения OutOfMemory? Если это так, я не получаю разбитые/поврежденные следы OOM. –

+0

Я отредактировал мой ans. пожалуйста, посмотрите –

+1

Итак, вы говорите, что это может быть вызвано тем, что я загружаю макет, такой как main .... кроме того, что этот макет НЕ включен в стандартную папку макета, а входит в макет-нормальный порт , layout-large-port и layout-xlarge-port & land (я установил ориентацию, чтобы она соответствовала одному из них) - может быть, потому, что устройства не могут определить свои собственные конфигурации и попытаться взять ресурс из папка макета? 0- Интересно, что я вижу несколько сообщений об устройствах, на которых я тестировал. –

2

Это произошло несколько раз, особенно на телефонах с низкой плотностью. Я также заметил, что в основном это происходит с 9-патч-изображениями.

Мое решение состояло в том, чтобы включить 9-патч-изображения в такие же папки ресурсов плотности, сколько я мог (mdpi, ldpi, hdpi, xdpi).

1

Хех, не знаю, я на самом деле работаю над подобной проблемой, но это может быть так. Стоит отметить, что, хотя устройство может масштабировать ресурсы и макеты, оно не может их масштабировать. Поэтому, если у вас есть минимальные значения, установите их в AndroidManifest.xml. Сначала попробуйте добавить layout-ldpi и layout-small.

Полезный метод для регистрации, макет которого был загружен, чтобы прикрепить android:tag каждого корневого контейнер файла макет XML, и в onCreate() после установки setContentView(R.id.layout) просто напечатать значение тега. Он скажет вам, что загрузилось - вам все равно нужно подключить отверстие, добавив все возможные комбинации, если только для отладки.

также переименуйте свои чертежи в папку drawables-nodpi, чтобы убедиться в отсутствии недостатков. это отключает внутреннее масштабирование, делает APK меньше и не «выбирает» из любой другой доступной папки.

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

в понедельник, когда я вернусь в офис я отправлю вам код метрики, используемые для измерения данных, полученных в этой теме - Which part of Android is in charge of picking a correct resource profile?

1

Вы включили некоторые коды, которые ссылаются на контент из Android SDK.

Например, я столкнулся с аналогичной проблемой раз и когда я снял линию

android:background="?android:attr/actionBarItemBackground" 

из моего XML, все снова работает нормально.

0

Это также может произойти, если ресурс, на который вы ссылаетесь (позвоните ему ResA), находится в очереди, ссылаясь на ресурс, который отсутствует (позволяет называть его ResB). Android поднимет ResourceNotFoundException для ResA, хотя на самом деле отсутствует ResB. Такова жизнь!

В моем случае ResB был определен в значениях-swxxxdp, но не в значениях. Поэтому я получал это исключение на телефонах, но не на планшетах.

36

Я получил это исключение:

Resources$NotFoundException: String resource ID 

, когда я использовал SetText с целочисленным значением. Мне пришлось преобразовать его в String.

До:

myTextView.setText(obj.SomeIntProperty);  

После:

myTextView.setText(String.valueOf(obj.SomeIntProperty)); 
+0

"" + int будет делать трюк, а также – stefan

0

В моем случае я имел файл макета, который привел к краху:

я получил следующую протоколирование

enter image description here

Это показал эту ссылку на мой реальный код:

enter image description here

Что эта строка кода:

enter image description here

Я проверил свои имена папок файлов штурман, как это было предложено самым популярным ответом и похоже, что ресурс, который предположительно отсутствует, находится в обычной папке layout

enter image description here

но при взгляде под Project файлом навигатор, а не Android файла штурмана я был в состоянии видеть, что не только якобы отсутствующий файл ресурсы не в нормальной layout папки, но я даже не папка layout без специального расширения.

enter image description here

Добавление каталога Android ресурсов в папку res и назвав его layout, а затем наклеивать над ресурсами из папки специальности (напр. layout-sw720dp) в это исправили проблему для меня.

enter image description here

Это решение также будет работать для других папок, как это было предложено, например, как не имеющие файлы в drawable и только имея их в drawable-xxhdpi может быть исправлена ​​путем перемещения файла в drawable и тонкой настройки его по мере необходимости. Удачи!

0
  1. Перейти к Project> Clean ...
  2. Выберите проект, а затем нажмите кнопку "OK".
  3. Перезапустить приложение.
Смежные вопросы