我收到此错误: “未捕获的处理程序:由于未捕获的异常java.lang.VerifyError”而导致线程主要退出“
这只发生在1.6。 Android 2.0及以上版本没有任何问题,但这是最重要的一点。
我无法捕获错误/异常(VerifyError),并且我知道它是由调用isInitialStickyBroadcast()引起的,这在SDK 4中不可用,这就是为什么它包含在SDK检查中。我只需要这个BroadcastReceiver工作在2.0+并且不打破1.6,它是市场上的应用程序,对于2.0+以上的用户需要UNDOCK功能,但显然不是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();
}
}
}
}
};
答案 0 :(得分: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不可用的任何类,方法或常量都会变灰。
答案 1 :(得分:2)
我遇到了类似的问题,但位图缩放在1.5和1.6之间。结束使用与this blog post中提供的解决方案类似的内容,创建一个实用程序类,根据API编号切换代码路径。
在该示例中需要注意的一点是,因为它支持1.5,所以使用android.os.Build.VERSION.SDK
已被弃用,但根据Dianne Hackborn(谷歌工程师)的说法,它将在未来的SDK版本中not be removed。如果您只支持1.6及更高版本,则可以使用android.os.Build.VERSION.SDK_INT
,但不会弃用。
此外,由于您的目标是1.6,如果您不依赖于该版本的框架,您可能也希望看一下支持1.5,在撰写本文时,1.5 31% of Android devices访问Android Market。
答案 2 :(得分:0)
由于这是一个错误而不是一个例外,它不会扩展Exception
。相反,它会扩展Throwable
,所以你必须抓住它:
try {
....
} catch ( Throwable e ) {
}
答案 3 :(得分:0)
要捕获错误,您可以执行以下操作。
try {
// write your code here
} catch (VerifyError e) {
// TODO: handle exception
}