2

アプリケーションに次のコードを使用したいと考えています。

InetAddress inetAddress;
try {
        inetAddress = InetAddress.getByName(hostname);
} catch (UnknownHostException e) {
        return -1;
}

私がテストしたほとんどのデバイスで問題なく動作しますが、Nexus S Europe と Huawei デバイスでは例外がスローされます。

192.168.010.200 のルートを確立できません: 未知のホスト

Application クラスで次のコードを使用して修正しようとしましたが、成功しませんでした。

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitNetwork().build();
StrictMode.setThreadPolicy(policy);

AsyncTask も使用しようとしましたが、同じエラーが発生しました。使用したコードは次のとおりです。

private int mInetAddr = -1;
private boolean mInetAck = false; // Acknowledgement

private class AsyncInetAddress extends AsyncTask<String, Void, Void>
{
    @Override
    protected Void doInBackground(String... hostname)
    {
        InetAddress inetAddress;
        try
        {
            inetAddress = InetAddress.getByName(hostname[0]);
        }
        catch (UnknownHostException e)
        {
            mInetAddr = -1;
            return null;
        }

        byte[] addrBytes;
        int addr;
        addrBytes = inetAddress.getAddress();
        addr = ((addrBytes[3] & 0xff) << 24)
                | ((addrBytes[2] & 0xff) << 16)
                | ((addrBytes[1] & 0xff) << 8)
                | (addrBytes[0] & 0xff);
        mInetAddr = addr;
        return null;
    }

    @Override
    protected void onPostExecute(Void result)
    {
        mInetAck = true; // Acknowledgement
    }
}

どうすればそれを修正できるかについて何か考えがありますか?

ありがとう。

編集: 他のいくつかのデバイスで試してみましたが、問題はバージョン 4.0.* にのみ存在するようです。2.* 、 3.* 、および 4.1+ でうまく機能します。

問題はその行にあります。

 if (!connMgr.requestRouteToHost(2, inetAddr))

どこでinetAddr = -938825536。最初のパラメータは MMS タイプです。この条件は、4.0.3 または 4.0.4 を実行しているデバイスでは常に true です。

4

4 に答える 4

1

最初に、発生する具体的なエラーは何ですか?
デバイスの問題ではなく、実行している Android のバージョンの問題である可能性があります。

これを変更してみてください:

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitNetwork().build();
StrictMode.setThreadPolicy(policy);  

に:

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
 StrictMode.setThreadPolicy(policy);
于 2013-01-15T15:13:00.180 に答える
0

AsyncTaskを使用してリクエストを行ってみてください。

AsyncTaskを使用すると、UIスレッドを適切かつ簡単に使用できます。このクラスを使用すると、スレッドやハンドラーを操作しなくても、バックグラウンド操作を実行してUIスレッドで結果を公開できます。

于 2013-01-15T16:02:05.297 に答える
0

私がこれまでに見つけた解決策は次のとおりです。

public static int lookupHost(String hostname) {
    // Hostname is to be `XXX.XXX.XXX.XXX` or `XXX.XXX.XXX.XXX:XXXX`
    hostname = hostname.substring(0, hostname.indexOf(":") > 0 ? hostname.indexOf(":") : hostname.length());
    String result = "";
    String[] array = hostname.split("\\.");
    if (array.length != 4) return -1;

    int[] hexArray = new int[] {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
    hexArray[0] = Integer.parseInt(array[0]) / 16;
    hexArray[1] = Integer.parseInt(array[0]) % 16;
    hexArray[2] = Integer.parseInt(array[1]) / 16;
    hexArray[3] = Integer.parseInt(array[1]) % 16;
    hexArray[4] = Integer.parseInt(array[2]) / 16;
    hexArray[5] = Integer.parseInt(array[2]) % 16;
    hexArray[6] = Integer.parseInt(array[3]) / 16;
    hexArray[7] = Integer.parseInt(array[3]) % 16;

    for (int i=0; i<8; i++)
    {
        result += Integer.toHexString( hexArray[i] );
    }

    return (new Long( Long.parseLong(result, 16) )).intValue();
}

私がテストしたほとんどのデバイスで動作しているようです。

于 2013-01-22T08:21:29.453 に答える
0

問題が解決しました。wifiが有効になっている間、IPへのルートを見つけることができません。最も簡単な方法は、wifi を無効にしてから、wifi を有効にすることです。

使用したコードは次のとおりです。

// Disable wifi if it's active
WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
if (wifiManager.isWifiEnabled())
{
      mWasWifiActive = true;
      wifiManager.setWifiEnabled(false);
      Log.e(TAG, "Wifi was enabled, now Off.");
}

// Do stuff here

// Re-enable wifi if it was active before routing
if (mWasWifiActive)
{
       WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
       wifiManager.setWifiEnabled(true);
       Log.e(TAG, "Wifi is back online.");
}
于 2013-01-24T14:42:38.343 に答える