【问题标题】:Android Issue on some devices某些设备上的 Android 问题
【发布时间】:2013-01-15 15:02:26
【问题描述】:

我想为我的应用程序使用以下代码:

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

它在我测试过的大多数设备上运行良好,但在 Nexus S Europe 和华为设备上,它会引发异常。

无法为 192.168.010.200 建立路由:未知主机

我已经尝试在我的应用程序类中使用以下代码修复它,但没有成功:

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。第一个参数是彩信类型。在运行 4.0.3 或 4.0.4 的设备下,条件始终为真。

【问题讨论】:

  • 你有抛出的异常吗?如果是这样,请发布日志
  • 你得到了哪个例外?
  • 我已经编辑了我的帖子,但有例外。
  • 异常提示此设备连接有问题。 IP 192.168.10.200 通常表示本地网络。因此,请确保两台设备都以相同的方式连接到网络 GSM/WiFi 或配置了 VPN。
  • 我所有的设备都已连接。这就是为什么它看起来很奇怪。

标签: android device inetaddress


【解决方案1】:

首先,您得到的具体错误是什么?
有可能不是设备的问题,而是你运行的安卓版本的问题。

并尝试改变这一点:

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

到:

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

【讨论】:

  • 谢谢,我会尽快测试。我已经用返回的异常更新了我的帖子。
  • 我尝试使用您的代码,但它会引发相同的异常。有什么想法吗?
【解决方案2】:

尝试使用AsyncTask 提出您的请求。

AsyncTask 允许正确且轻松地使用 UI 线程。这节课 允许执行后台操作并在 UI 上发布结果 线程,而无需操作线程和/或处理程序。

【讨论】:

  • 谢谢,但为什么它在某些设备上有效,而在其他设备上无效?这个问题真的很奇怪。
  • 这取决于Android版本,最近的版本不让UI线程做网络的东西。
  • 正如文斯所说,新的 Android 版本不允许您发出网络请求并在 MainThread 中工作(如活动或服务)。 AsyncTask 是最好的方法。如果可行,请将问题标记为 sinalize。
  • Android 从 3.0 及更高版本开始实现此功能。
  • 我要测试一段实现AsyncTask的代码。我会尽快给你结果。
【解决方案3】:

目前我找到的解决方案如下:

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

它似乎可以在我测试过的大多数设备上运行。

【讨论】:

    【解决方案4】:

    问题解决了。 启用 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.");
    }
    

    【讨论】:

      猜你喜欢
      • 2021-03-14
      • 2013-12-06
      • 1970-01-01
      • 2021-01-10
      • 1970-01-01
      • 1970-01-01
      • 2018-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多