Как решить SocketException: Ошибка поиска хоста: «www.xyz.com» (Ошибка ОС: нет адреса, связанного с именем хоста, errno = 7)

Всякий раз, когда я пытаюсь сделать http-вызов примерно через 20 секунд, я получаю в консоли следующую ошибку:

E/flutter ( 8274): [ERROR:flutter/shell/common/shell.cc(184)] Dart Error: Unhandled exception:
E/flutter ( 8274): SocketException: Failed host lookup: 'flutter-project-xxxxx.firebaseio.com' (OS Error: No address associated with hostname, errno = 7)

Эта ошибка возникает для каждого метода и каждого маршрута, который я вызываю через http-пакет приложения.

Я разрабатываю флаттер-приложение для Windows, используя виртуальное устройство AVD из Android Studio.

Версии:

  http: ^0.12.0+1
  flutter: 1.0

Случаи:

  1. Из дома или в режиме модема с моего телефона: подключение работает нормально на каждой части виртуального устройства

  2. Из моей рабочей сети (за брандмауэром):

Только с Android Web View я могу без проблем просматривать Интернет (я даже могу вызвать тот же URL-адрес, который я использую в коде, и он работает). Я получаю сообщение об ошибке подключения при использовании любого другого приложения (Chrome, Google Play и т. д.) на виртуальном устройстве и, в частности, "SocketException" при тестировании моего приложения.

В чем разница между звонками из этого приложения? Есть ли способ маршрутизировать вызовы моего приложения так же, как и в веб-просмотре?

Спасибо!

Просто хотел добавить, что эта ошибка может возникнуть, если ваш телефон подключен к WiFi с брандмауэром ... это может блокировать трафик (в моем случае это было для корпоративной настройки). Не всегда первая мысль, но стоит упомянуть

Petro 02.12.2020 22:06

Я использую реальное устройство, в моем случае мои мобильные данные не включены, поэтому я просто использую свои мобильные данные, тогда проблема будет решена, поэтому, пожалуйста, проверьте соединение с реальным устройством.

Tushar Nikam 05.12.2020 17:01
92
2
93 323
33
Перейти к ответу Данный вопрос помечен как решенный

Ответы 33

Попробуйте добавить <uses-permission android:name = "android.permission.INTERNET" /> в свой файл AndroidManifest.xml.

Сработало ли это, у меня та же проблема, http-вызовы работают при разработке, но терпят неудачу при производстве.

Isaac Obella 29.03.2019 08:22
Ответ принят как подходящий

Добавление разрешение на интернет — это не только решение.
Вы также должны убедиться, что вы в сети, будь то мобильный или эмулятор

  1. Make sure you are online whether it is mobile or emulator

  2. Make sure you have given internet permission in your app's android/app/src/main/AndroidManifest.xml

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

Любопытно, что это работает без разрешения интернета в режиме отладки.

Sisir 05.03.2020 09:37

Если приложению требуется доступ к состоянию сети, т. е. разрешить приложению доступ к информации о сетях, то также необходимо следующее разрешение. <uses-permission android:name = "android.permission.ACCESS_NETWORK_STATE" /> Дополнительные сведения см.: developer.android.com/training/basics/network-ops/подключение

varad11 14.04.2020 11:15

@Choco, как в телефоне

Ishwar Chandra Tiwari 27.07.2020 16:26

Я узнал, что существует несколько файлов AndroidManifest.xml. По крайней мере, один в /main и еще один в /debug.

Asad S 05.11.2020 11:24

В моем случае был включен «Режим полета». Выключил, и все снова заработало (не могу объяснить, что включило)

Mengrolek 10.02.2021 15:43

Существует несколько AndroidManifest.xml, вам нужно различать их. /debug/AndroidManifest.xml — для отладочного приложения (в разработке), а /main/AndroidManifest.xml — для рабочего приложения (APK). Вам необходимо предоставить доступ к обоим файлам.

tom hikari 13.04.2021 11:20

Я только что потерял одно утро из-за этого ... какого черта будет работать в эмуляторе и даже в режиме отладки на моем личном телефоне, а в промежуточной сборке - нет ?? Я весьма озадачен.

venir 01.10.2021 12:09

Я добавил <uses-permission android:name = "android.permission.INTERNET" /> в мой манифест. Затем мне пришлось перезапустить эмулятор, чтобы интернет заработал.

То же самое и здесь: не удалось подключиться к внешнему миру через http, и у меня также была эта запись в файле AndroidManifest.xml. Итак, я перезапустил эмулятор и вуаля, все заработало отлично.

larryq 05.08.2019 21:40

Если вы используете эмулятор, убедитесь, что мобильные данные активны.

это то, что сработало для меня. Пришлось отключить Wi-Fi и полагаться только на данные. У меня уже было <uses-permission android:name = "android.permission.INTERNET" />.

Alicester4WonderlandPresident 13.08.2019 18:04

Проблема в основном возникает, когда устройство пытается получить доступ к любым интернет-ресурсам, чтобы исправить, добавьте в файл AndroidManifest.xml по адресу @android/app/src.

Проверьте, подключен ли Wi-Fi или нет. Мой работал после перезапуска Wi-Fi.

Если вы получаете эту ошибку при использовании плагина flutter_socket_io, не забудьте инициализировать сокет, т.е. socketIO.init(); socketIO.connect();, прежде чем пытаться подписаться на него. Я получил ту же ошибку, что и указанная выше, когда я ее пропустил.

Проверьте, включили ли вы автономную работу в настройках gradle. Файл-> Настройки -> Сборка -> Инструменты сборки -> Автономная работа

Если он включен или отмечен, снимите его.

  • Убедитесь, что интернет включен (как на телефоне, так и на ПК)
  • также убедитесь, что сервер работает правильно
  • правильно проверьте свой URL

Кроме того, было бы неплохо взглянуть на «Настройки прокси» внутри «Расширенных элементов управления» эмулятора.

У меня это сработало, если я использовал настройку «Без прокси».

Для тех, кто не находит этот экран (Расширенные элементы управления) в новых версиях Android-студия, вам придется перейти к Настройки -> Эмулятор и снимите флажок Запустить в окне инструментов. Затем перезапустите эмулятор.

Philipos D. 30.07.2021 10:45

Убедитесь, что ваше мобильное устройство или эмулятор подключены к Интернету.

Когда я включил Wi-Fi на своем устройстве, он работал нормально.

Пожалуйста, опубликуйте свой ответ этого типа в разделе комментариев, если он содержит код, тогда все в порядке, пожалуйста, убедитесь в будущем.

Jaimil Patel 21.04.2020 08:28

Перевод: В моем случае на компьютере был интернет, а на эмуляторе - нет. Я настроил соединение на эмуляторе и решил его.

@SkypeMeSM Пожалуйста, не переводите сообщения для автора. Если автор не может выразить свой вклад на английском языке, то он также не может принимать отзывы, обсуждать и реагировать.

Yunnosch 30.04.2020 10:12

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

Rahul Kushwaha 04.12.2021 10:30

@RahulKushwaha Нет, автор этого поста его не переводил.

Yunnosch 04.12.2021 10:50

Дважды проверьте / убедитесь, что у вас есть

<uses-permission android:name = "android.permission.INTERNET" /> в файле android/app/src/main/AndroidManifest.xml вашего приложения.

Даже после добавления

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

в вашем android/app/src/main/AndroidManifest.xml, если вы все еще находите проблемы, тогда

Может быть ошибка с IP-адрес сервера веб-сайта, например:

Server IP address could not be found

Лучше подождать некоторое время и обязательно перезапустить вайфай, у меня сработало.

Убедитесь, что ваш эмулятор или ваше устройство подключены к Интернету. если ваш эмулятор не может подключиться к Интернету, используйте VPN.

Иногда другой Wi-Fi может мешать подключенному Wi-Fi, что также может вызвать эту ошибку. Попробуйте настроить канал подключенного Wi-Fi на автоматический или вдали от других каналов Wi-Fi.

Даже у меня была такая же проблема. Я перезапустил свой эмулятор, и он сработал!

Пожалуйста, дважды проверьте свою формулировку «Даже я…». Для читателей с другим языковым опытом, который читается странно и может быть неправильно истолкован (правда, с некоторым усилием) как нечто неуважительное.

Yunnosch 30.09.2020 16:43

Включив WIFI, он работает для меня, и убедитесь, что вы также добавили разрешение на Интернет в манифест Android, который он также добавил автоматически, но вы должны убедиться. если все еще нет, то аннулируйте кеши и перезапустите, надеюсь, это сработает

У меня была такая же проблема при запуске приложения на эмулятор.

Мой ноутбук был подключен к Интернету через Мобильная точка доступа моего телефона. Но, видимо, эмулятор не смог получить доступ к Интернету.

Позже я переключился на соединение с маршрутизатором Вай-фай, и приложение прошло гладко, как и ожидалось.

Я не уверен, но есть ли какой-то особый доступ?

Подсказка: Попробуйте поискать что-нибудь в эмуляторе, чтобы проверить подключение к Интернету

Перейдите к диспетчеру AVD, затем выберите свой эмулятор, в меню «Действия» щелкните знак выбора вниз, затем выберите «Стереть данные» и перезапустите эмулятор. Меня устраивает.

только этот ответ сработал для меня, очень хорошо и ура

Yasir Hantoush 21.06.2021 20:46

Сначала я обновил свой флаттер и стер данные эмулятора в диспетчере AVD. Это сработало.

G.S Dash 12.11.2021 12:44

если вы используете vscode, вы получите gai_error=0, если http успешно подключен

Вот правильное место для размещения разрешения на доступ в Интернет, потому что было довольно сложно узнать местоположение

<manifest xmlns:android = "http://schemas.android.com/apk/res/android"
package = "com.example.appName">
<uses-permission android:name = "android.permission.INTERNET" />

запустите команду запуска флаттера на терминале кода cmd или Visual Studio

Для меня это был просто плохой URL-адрес с функцией «Uri.https(...)» во Flutter. Проверьте правильность адреса в вашем браузере

Проблема для меня заключалась в том, что я использовал VPN. У эмулятора не было доступа в Интернет при подключении к VPN на моем компьютере. Это может помочь кому-то.

В моем случае это было из-за того, что мой телефон не был подключен к Интернету.

Просто включите интернет-соединение

Я намеренно отключил свой эмулятор Wi-Fi, чтобы посмотреть, что произойдет (поскольку могут быть случаи, когда интернет недоступен). Ошибка привела меня сюда, но все, что я вижу, это обходные пути, а не обработка ошибок. На самом деле, приложение должно корректно обрабатывать ошибку и не вылетать из-за отсутствия соединения.

До сих пор все, что я сделал, это поймал ошибку, и если код возврата равен -1 (или что-то другое, кроме 200), я знаю, что у меня проблема, и могу заставить приложение реагировать соответствующим образом.

var request = new http.MultipartRequest("POST", uri);

// multipart that takes file
var multipartFile = new http.MultipartFile('file', stream, length,
    filename: fileToUpload.path);

// add file to multipart
request.files.add(multipartFile);

// send
try {
  var response = await request.send();
  print(response.statusCode);

  // listen for response
  response.stream.transform(utf8.decoder).listen((value) {
    print(value);
  });

  return response.statusCode;
}
catch (e)
{
  return -1;
}

Это определенно проблема с Интернетом, как заявляли другие. Ответ @petro и @Tushar Nikam направил меня в правильном направлении. Мой эмулятор был в режиме полета, но я не знаю как; это тот, который я использую в 90% случаев. Я бы посоветовал проверить все, что может блокировать подключение к Интернету.

проверьте свой URL-адрес. В моем случае я использовал неправильный URL-адрес.

Вы должны попробовать следующее:

Попробуйте запустить приложение в режиме отладки, если оно работает нормально и не работает в режиме выпуска, тогда это может быть связано с проблемой разрешений, поэтому добавьте разрешения (INTERNET, ACCESS_NETWORK_STATE) в файле манифеста.

  • your_project_root_directory/android/app/src/debug/AndroidManifest.xml
  • your_project_root_directory/android/app/src/main/AndroidManifest.xml
  • your_project_root_directory/android/app/src/profile/AndroidManifest.xml

Если не включены, добавьте разрешения:

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

Если он не работает в режиме отладки, проверьте правильность вашего URL-адреса, нажав в почтальоне. Если он работает в почтальоне, вы должны выполнить свой веб-сервис следующим образом:

Добавьте зависимость в pubspec.yaml:

dependencies:
  flutter:
    sdk: flutter

  http: 0.13.3

После добавления http:0.13.3 нажмите кнопку Pub get. Если он выполнен с кодом 0, это означает, что он успешно добавлен в ваш проект.

в вашем файле дротика импортируйте http.dart:

import 'package:http/http.dart';

Теперь напишите этот код для запуска веб-сервиса:

var url = Uri.parse('some-url-login?username=abc&&password=xyz');
var response = await get(url, headers: {
          'Content-Type': 'application/json',
          'Access-Control-Allow-Origin': '*',
          'Access-Control-Allow-Credentials': 'true',
          'Access-Control-Allow-Headers': 'Content-Type',
          'Access-Control-Allow-Methods':
          'GET,PUT,POST,DELETE'
        });
if (response.statusCode == 200) {
 // success
} else if (response.statusCode == 404){
 // not found
} else if (response.statusCode == 500){
 // server not responding.
} else {
 // some other error or might be CORS policy error. you can add your url in CORS policy. 
}

Я надеюсь, что это поможет вам. Холод!

Я использую арх линукс.

Linux arch 5.14.7-arch1-1

И флаттер версия

Flutter 2.2.1 

Дартс версия

Dart 2.13.1

Редактор кода

1.58.0

В моем случае включение Wi-Fi решило проблему.

Для меня проблема заключалась в том, что у моего эмулятора были отключены сетевые подключения (LTE и Wi-Fi).

В моем случае я открыл эмулятор до того, как подключился к WIFI к системе. Когда сеть (WIFI) подключилась к моей системе, но не смогла подключиться к эмулятору. Эта проблема возникает из-за отсутствия доступа в Интернет к Эмулятор. Я решил эту проблему таким образом.

Решения:

Подключил сетевой доступ к системе, после чего закрыл эмулятор и заново открыл. Установите приложения, запустите приложение и откройте его. Наконец, все API работают нормально.

Убедитесь, что вы добавили в android/app/src/main/AndroidManifest.xml

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

Другие вопросы по теме