2012-10-12 95 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