не могу поймать java.lang.VerifyError - PullRequest
4 голосов
/ 06 января 2010

Я получаю эту ошибку: "Uncaught handler: выход из основного потока из-за неперехваченного исключения java.lang.VerifyError"

Это происходит только на 1.6. У Android 2.0 и выше проблем нет, но это главное.

Я не могу поймать ошибку / исключение (VerifyError), и я знаю, что это вызвано вызовом isInitialStickyBroadcast (), который недоступен в SDK 4, поэтому он включен в проверку SDK. Мне просто нужен этот BroadcastReceiver для работы на 2.0+, а не на 1.6, это приложение на рынке, функция UNDOCK необходима для пользователей на 2.0+, но, очевидно, не на 1.6, но на 1.6 все еще достаточно пользователей.

Как исправить?

Спасибо!

private BroadcastReceiver mUndockedReceiver = new BroadcastReceiver()
{
      @Override
      public void onReceive(Context context, Intent intent) 
      {
          //FROM ECLAIR FORWARD, BEFORE DONUT THIS INTENT WAS NOT IMPLEMENTED
          if (Build.VERSION.SDK_INT >= 5)
          {
              if (!isInitialStickyBroadcast()) {
                  int dockState = intent.getExtras().getInt("android.intent.extra.DOCK_STATE", 1);
                  if (dockState == 0)
                  {
                      finish();
                  }
              }
          }           
      }
};  

Ответы [ 4 ]

4 голосов
/ 06 января 2010

Intent.EXTRA_DOCK_STATE существует только в API уровня 5 и выше, поэтому будет работать только на устройствах Android 2.0 (или выше).

Даже если вы включаете вызов в проверку уровня API, код не будет работать при запуске его в среде выполнения Android 1.6, поэтому VerifyError.

Решением было бы заменить вызов на Intent.EXTRA_DOCK_STATE его постоянным значением: android.intent.extra.DOCK_STATE.


Как правило, при просмотре документации по API рекомендуется установить флажок «Фильтровать по уровню API» и установить значение 4 в вашем случае. Таким образом, любые классы, методы или константы, недоступные для Android 1.6, будут выделены серым цветом.

2 голосов
/ 20 января 2010

У меня была похожая проблема, но с масштабированием растрового изображения между 1,5 и 1,6. Закончилось использование чего-то похожего на решение, представленное в этом сообщении в блоге , чтобы создать служебный класс, который переключает путь кода в зависимости от номера API.

В этом примере следует отметить одну вещь: поскольку он поддерживает 1.5, он использует android.os.Build.VERSION.SDK, что устарело, но, согласно Дайан Хакборн (инженер Google), оно будет не удалено в будущих выпусках SDK. Если вы поддерживаете только 1.6 и выше, вы можете использовать android.os.Build.VERSION.SDK_INT, что не рекомендуется.

Кроме того, поскольку вы нацеливаетесь на 1.6, если вы не настолько зависимы от этой версии платформы, возможно, вы захотите взглянуть и на поддержку 1.5, на момент написания этой статьи 1.5 составляет 31% от Устройства Android , имеющие доступ к Android Market.

0 голосов
/ 12 февраля 2015

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

try {

  // write your code here

    } catch (VerifyError e) {
        // TODO: handle exception
    }
0 голосов
/ 06 января 2010

Поскольку это ошибка, а не исключение, она не будет расширяться Exception. Скорее, он будет расширяться Throwable, поэтому вы должны поймать это:

try {

....

} catch ( Throwable e ) {
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...