0

このメソッドを使用して、BroadCast アドレスの配列を取得しています。

使用されているメソッドとクラスの一部が古い API に存在しないため、メソッドの先頭にバージョン チェックを追加しました。これを Android 1.6 エミュレータで実行しようとすると、検証エラーで失敗します。

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;
}
 }

これらは出てくるエラーです

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 は、API レベル 4 以降でのみ使用できます。これらの問題の回避策を探しています

4

1 に答える 1

0

これは 1.6 では機能しません。1.6 クラスローダは、実際にメソッドを呼び出さなくても、すべてのメソッドをチェックしようとするため、エラーが発生します。を呼び出すラッパー クラスを作成して、getInterfaceAddress()まったく読み込まれないようにする必要があります。

于 2012-10-13T08:58:30.180 に答える