簡體   English   中英

某些設備上的Android Issue

[英]Android Issue on some devices

我想在我的應用程序中使用以下代碼:

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

它在我測試過的大多數設備上都能很好地工作,但在Nexus S Europe和華為設備上,它會拋出異常。

無法為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。

首先,您會遇到什么具體錯誤?
可能不是設備問題,而是您正在運行的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);

嘗試使用AsyncTask發出您的請求。

通過AsyncTask,可以正確,輕松地使用UI線程。 此類允許執行后台操作並在UI線程上發布結果,而無需操縱線程和/或處理程序。

到目前為止,我發現的解決方案如下:

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

它似乎可以在我測試過的大多數設備上使用。

問題解決了。 啟用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.");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM