UnknownHostException при отправке HTTPS / HTTP POST с устройства Android - PullRequest
4 голосов
/ 17 июня 2011

Я пытаюсь создать HTTP POST для серверов Google, чтобы получить ClientLogin Auth (как описано здесь ). Исходный код для поста не является настоящей загадкой, и я нашел его здесь . (Я уверен, что мой пост работает, потому что, используя CURL, я получаю Auth)

Метод очень прост, и я соответствующим образом изменил значения, однако я получаю следующее исключение, когда выполняю следующую строку:

HttpResponse response = client.execute(post);

06-17 13:44:05.645: WARN/System.err(768): java.net.UnknownHostException: www.google.com
06-17 13:44:05.645: WARN/System.err(768):     at java.net.InetAddress.lookupHostByName(InetAddress.java:506)
06-17 13:44:05.645: WARN/System.err(768):     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:294)
06-17 13:44:05.645: WARN/System.err(768):     at java.net.InetAddress.getAllByName(InetAddress.java:256)
06-17 13:44:05.645: WARN/System.err(768):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:136)
06-17 13:44:05.645: WARN/System.err(768):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
06-17 13:44:05.645: WARN/System.err(768):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
06-17 13:44:05.645: WARN/System.err(768):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:359)
06-17 13:44:05.645: WARN/System.err(768):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
06-17 13:44:05.645: WARN/System.err(768):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
06-17 13:44:05.645: WARN/System.err(768):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
etc.
etc.
etc…

(нерелевантный журнал пропущен).

Попробовав различные комбинации кода (можно найти в Google и здесь), разные URL-адреса (с или без HTTPS), обычный HTTP тоже и т. Д. Я решил попробовать следующее:

try {
       InetAddress address = InetAddress.getByName("http://www.google.com");
} catch (UnknownHostException e) {
    e.printStackTrace();
}

и я получаю ту же ошибку: (обрезал нерелевантные части тоже)

06-17 13:53:07.445: WARN/System.err(820): java.net.UnknownHostException: http://www.google.com
06-17 13:53:07.449: WARN/System.err(820):     at java.net.InetAddress.lookupHostByName(InetAddress.java:506)
06-17 13:53:07.449: WARN/System.err(820):     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:294)
06-17 13:53:07.449: WARN/System.err(820):     at java.net.InetAddress.getByName(InetAddress.java:325)

Теперь я уверен, что перезапустил Eclipse, The Phone, я даже забыл Wi-Fi и заново его создал. Я использую СТАТИЧЕСКИЙ IP-адрес в телефоне с DNS-сервером Google или OpenDNS (я поменял их местами, чтобы попробовать). Интернет на телефоне работает, другие приложения работают.

I do have

<uses-permission android:name="android.permission.INTERNET" /> 

в моем Манифесте в правильном месте (внутри приложения), фактически у меня также есть "android.permission.ACCESS_FINE_LOCATION", но это ничего не меняет.

Устройство

Это новый Nexus-S (разблокированный) с Android 2.3.4.

Код, который не работает

Это рассматриваемый метод: (см. Строку HttpResponse response = client.execute (post);)

Обратите внимание, что я удалил «реальные значения», но будьте уверены, правильные значения в исходном коде.

public void getAuthentification(View view) {
    SharedPreferences prefs = PreferenceManager
            .getDefaultSharedPreferences(this);

    HttpClient client = new DefaultHttpClient();
    HttpPost post = new HttpPost(
            "https://www.google.com/accounts/ClientLogin");

    try {

        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
        nameValuePairs.add(new BasicNameValuePair("Email", prefs.getString(
                "user", "undefined")));
        nameValuePairs.add(new BasicNameValuePair("Passwd", prefs
                .getString("password", "undefined")));
        nameValuePairs.add(new BasicNameValuePair("accountType", "GOOGLE"));
        nameValuePairs.add(new BasicNameValuePair("source",
                "Google-cURL-Example"));
        nameValuePairs.add(new BasicNameValuePair("service", "ac2dm"));

        post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        HttpResponse response = client.execute(post);
        BufferedReader rd = new BufferedReader(new InputStreamReader(
                response.getEntity().getContent()));

        String line = "";
        while ((line = rd.readLine()) != null) {
            Log.e("HttpResponse", line);
            if (line.startsWith("Auth=")) {
                Editor edit = prefManager.edit();
                edit.putString(AUTH, line.substring(5));
                edit.commit();
                String s = prefManager.getString(AUTH, "n/a");
                Toast.makeText(this, s, Toast.LENGTH_LONG).show();
            }

        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Чего мне не хватает?

Ответы [ 2 ]

6 голосов
/ 17 июня 2011

Хорошо, после прочтения этого ответа и в отличие от того, что я прочитал в других результатах Google,…

<uses-permission android:name="android.permission.INTERNET" /> 

… должно быть вне приложения .

У меня есть:

       <!-- General Permissions -->
       <uses-permission android:name="android.permission.INTERNET" />
    </manifest>

Теперь все работает.

0 голосов
/ 17 июня 2011

Вы пробуете это на устройстве? Иногда происходит то, что эмулятор не может разрешить DNS и выдает сообщение об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...