2

下面是一些我用来访问Build.SERIAL静态字段的代码,但是在 Android 1.6 上运行时它会崩溃!

// introduced in Android 2.3(API Level 9)
if (Integer.parseInt(android.os.Build.VERSION.SDK) >= android.os.Build.VERSION_CODES.GINGERBREAD) {
            deviceID = android.os.Build.SERIAL; //cannot execute here if runs on Android 1.6!!!
}


那是崩溃日志:

 DexOpt: couldn't find static field
 W/dalvikvm( 1098): VFY: unable to resolve static field 37 (SERIAL) in Landroid/os/Build;
 W/dalvikvm( 1098): VFY: rejecting opcode 0x62 at 0x0001
 W/dalvikvm( 1098): VFY: rejected Lcom/opera/mini/android/DisplayNotificationService;.getDeviceSerialID ()Ljava/lang/String;
 W/dalvikvm( 1098): Verifier rejected class Lcom/opera/mini/android/DisplayNotificationService;
 W/dalvikvm( 1098): Class init failed in newInstance call (Lcom/opera/mini/android/DisplayNotificationService;)
 D/AndroidRuntime( 1098): Shutting down VM
 W/dalvikvm( 1098): threadid=3: thread exiting with uncaught exception (group=0x4001da10)
 E/AndroidRuntime( 1098): Uncaught handler: thread main exiting due to uncaught exception`

那么如何解决这个问题呢?

4

3 回答 3

0

如果您查看 Android文档android.os.Build.VERSION_CODES.GINGERBREAD则从 API 级别 9 (Gingerbread) 开始支持。从 If 条件中删除它并以另一种方式进行检查。例如,检查 SDK 是否大于 DONUT,然后执行其他操作来获取串行。

更新: 我的意思是这样尝试,例如:

if (Integer.parseInt(android.os.Build.VERSION.SDK) >= 9) {
             deviceID = android.os.Build.SERIAL;
} 
于 2012-09-10T11:43:02.807 回答
0

使用Build.VERSION.SDK_INT而不是Integer.parseInt(android.os.Build.VERSION.SDK)然后通过数字检查它Build.VERSION.SDK_INT>9

于 2014-03-03T08:58:53.930 回答
0

使用 SDK_INT 而不是 SDK,因为它是整数而不是字符串,并消除了您遇到的比较问题。

这对我有用:

if(Build.VERSION.SDK_INT >= 9){
        deviceID = android.os.Build.SERIAL;  
}
于 2013-10-11T13:43:31.260 回答