尝试访问android.os.Build.SERIAL(如果可用)

时间:2012-09-10 11:34:43

标签: android

以下是我用来访问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`

那么如何解决这个问题?

3 个答案:

答案 0 :(得分:0)

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

<强>更新  我的意思是尝试这样的例如:

if (Integer.parseInt(android.os.Build.VERSION.SDK) >= 9) {
             deviceID = android.os.Build.SERIAL;
} 

答案 1 :(得分:0)

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

这对我有用:

if(Build.VERSION.SDK_INT >= 9){
        deviceID = android.os.Build.SERIAL;  
}

答案 2 :(得分:0)

使用Build.VERSION.SDK_INT代替Integer.parseInt(android.os.Build.VERSION.SDK),然后按照Build.VERSION.SDK_INT>9

等数字进行检查