2010-01-06 5 views
4

Я получаю эту ошибку: «Uncaught обработчика: нить главного выхода из-за неперехваченное исключение java.lang.VerifyError»не может поймать 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(); 
        } 
       } 
      }   
     } 
}; 
+1

Это намерение, очевидно, только для регистрации SDK> = 5 .. и его корректно работает на 5 ^, но не зарегистрировавшись на 4 (SDK для Android 1.6). – velazcod

+1

, и мне не нужно регистрировать его на 1.6 ... Я не регистрирую трансляцию трансляции на 1.6, только на 2.0 и выше. – velazcod

ответ

4

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, будут выделены серым цветом.

+0

конечно, имеет смысл. Однако я заменил его на постоянное значение, подобное этому, и я все еще получаю VerifyError. intent.getExtras(). GetInt ("android.intent.extra.DOCK_STATE", 1); – velazcod

+0

'isInitialStickyBroadcast()' также доступен только на Android 2.0+, поэтому вы можете видеть, можете ли вы обойтись без этого вызова. –

+1

это правильно, вот почему я обертываю все это в проверку SDK ... это сосать, если это невозможно исправить. – velazcod

0

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

try { 

.... 

} catch (Throwable e) { 
} 
+0

это не сработало, спасибо – velazcod

2

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

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

Кроме того, поскольку вы настроите таргетинг на 1.6, если вы не зависите от этой версии фреймворка, вы можете посмотреть на поддержку 1.5, а на момент написания 1.5 это 31% of Android devices, доступ к Android Маркету ,

0

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

try { 

    // write your code here 

    } catch (VerifyError e) { 
     // TODO: handle exception 
    } 
Смежные вопросы