2012-10-12 62 views
0

我正在使用此方法获取BroadCast地址数组。如何摆脱Android验证错误

一些方法和使用的类不存在于旧的API中 所以我在方法的开头添加了一个版本检查。我试图在Android 1.6 Emulator上运行这个检查,并且验证失败错误。

private InetAddress[] getBroadCast() throws SocketException 
{ 

    int currentapiVersion = android.os.Build.VERSION.SDK_INT; 
    if (currentapiVersion < 9) 
    {  
     try { 
      String ipString = getWifiIp(); 
      int loc = ipString.lastIndexOf("."); 
      InetAddress baddrs[] = new InetAddress[1]; 
      baddrs[0] = new InetAddress.getByName(ipString.substring(0, loc)+".255"); 
      return baddrs; 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 
      else{ 
    String bcast=""; 
    for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { 
     NetworkInterface intf = en.nextElement(); 

     for (InterfaceAddress address : intf.getInterfaceAddresses()) { 
      if(address.getBroadcast()!=null) bcast=bcast+address.getBroadcast().toString().substring(1)+"::"; 
     }} 
    String[] bcastarray= bcast.split("::"); 
    InetAddress baddrs[] = new InetAddress[bcastarray.length]; 
    for(int i=0;i<bcastarray.length;i++) 
     try { 
      baddrs[i] = new InetAddress.getByName(bcastarray[i]); 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } 
    return baddrs; 
} 
} 

这些都是仅仅从API级别4和高达拿出

10-12 11:38:22.030: W/dalvikvm(297): VFY: unable to resolve virtual method 4463: Ljava/net/NetworkInterface;.getInterfaceAddresses()Ljava/util/List; 
10-12 11:38:22.030: W/dalvikvm(297): VFY: rejecting opcode 0x6e at 0x0071 
10-12 11:38:22.040: W/dalvikvm(297): VFY: rejected Lhello/BroadcastSend;.getBroadCast()[Lhello/IPMAddress; 
10-12 11:38:22.040: W/dalvikvm(297): Verifier rejected class Lhello/BroadcastSend; 
10-12 11:38:22.040: W/dalvikvm(297): threadid=19: thread exiting with uncaught exception (group=0x4001aa28) 

android.os.Build.VERSION.SDK_INT是可用的错误。我正在寻找解决这些问题的方法

+0

您是否缺少'else'子句?使用您当前的代码,无论版本如何,都会执行getInterfaceAddresses()代码。 –

+0

增加了else子句,但这并不妨碍验证者拒绝1.6设备上的代码。 – coderplus

+1

啊,我现在看到了。这不适用于1.6。 1.6类加载器将尝试检查所有方法,即使您没有实际调用它们,这也是您遇到错误的原因。您必须创建一个调用'getInterfaceAddress()'的包装类,以便它根本不会被加载。 –

回答

0

这不适用于1.6。 1.6类加载器将尝试检查所有方法,即使您没有实际调用它们,这也是您遇到错误的原因。你必须创建一个叫做getInterfaceAddress()的包装类,这样它才不会被加载。

+0

谢谢。我正在使用Play商店的多种apk功能来摆脱此问题。现在我正在使用包装类的单个apk :-) http://android-developers.blogspot.in/2009/04/backward-compatibility-for-android.html上有一个非常简洁的例子。 – coderplus