如何解决SocketException: Failed host lookup: 'www.xyz.com' (OS Error: No address associated with hostname, errno = 7)?

155

每当我尝试进行 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)

每次我通过 app http 包调用任何方法和任何路由时都会出现这个错误。

我正在Windows上开发一个Flutter应用程序,使用Android Studio中的AVD虚拟设备。

版本:

  http: ^0.12.0+1
  flutter: 1.0

案例:

  1. 从家里或通过我的手机连接:虚拟设备的每个部分都可以正常使用连接。

  2. 从我的工作网络(防火墙后面):

只有使用Android Web View,我才能浏览互联网而没有任何问题(我甚至可以调用在代码中使用的相同 URL,并且它可以正常工作)。 当在虚拟设备中使用任何其他应用程序(Chrome、Google Play 等)时,我会收到连接错误,特别是在测试我的应用程序时出现“SocketException”。

那个应用程序发出的调用有什么区别? 是否有一种方法将我的应用程序调用路由到与 Webview 中的调用相同的方式?

谢谢!


8
只是想补充一下,如果您的手机连接到带有防火墙的WiFi,可能会出现此错误...这可能会阻止流量(在我的情况下,这是企业设置)。这不总是第一个想法,但值得一提。 - Petro
1
我正在使用真实设备,在我的情况下,我的移动数据没有开启,所以我只需要打开我的移动数据,问题就会得到解决,所以请检查您与真实设备的连接。 - Tushar Nikam
我不会称这为百分之百的答案,但对于我来说,断开当前连接的5G网络并连接到2.4G网络解决了问题。不确定原因是什么。 - Pyzard
39个回答

276

添加互联网权限不是唯一的解决方法。
您还必须确保您在线无论是手机还是模拟器

  1. 确保您在线上,无论是手机还是模拟器

  2. 确保您在应用的android/app/src/main/AndroidManifest.xml文件中授予了互联网权限

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


55
在调试模式下,奇妙的是这可以不需要互联网权限。 - Sisir
8
如果应用程序需要访问网络状态,即允许应用程序访问有关网络的信息,则还需要以下权限。 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 获取更多信息,请参考:https://developer.android.com/training/basics/network-ops/connecting - varad_s
11
有多个 AndroidManifest.xml 文件,你需要区分它们。/debug/AndroidManifest.xml 文件用于开发中的调试应用,而/main/AndroidManifest.xml 则用于生产环境下的 APK 应用。你需要在这两个文件中授予权限。 - tom hikari
1
我刚刚浪费了一个上午......为什么在模拟器上和在我个人手机的调试模式下都能工作,但是在分阶段构建中却不能??我很困惑。 - venir
2
@Sisir 当应用程序编译时,它会合并所有 Android 清单(来自所有插件和主清单)。因此,即使您没有添加某些权限,如果插件清单中有它,它也会出现在编译的清单中。 - Pierre
显示剩余5条评论

44

<uses-permission android:name="android.permission.INTERNET" />添加到你的AndroidManifest.xml文件中。


5
这个有用吗?我遇到了同样的问题,在开发环境中HTTP调用可以正常工作,但在生产环境中失败了。 - Isaac Obella
如果您不确定它是否有效,请不要将其作为答案。 - stackunderflow

35

确保您已在android/app/src/main/AndroidManifest.xml中添加了

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

输入图像描述


1
感谢分享图片,它帮助我知道该把它放在哪里。 - Muhammet

24

我向manifest文件添加了<uses-permission android:name="android.permission.INTERNET" />。然后,我需要重新启动模拟器才能使网络正常工作。


同样的问题,我也无法通过http连接到外部世界,并且在AndroidManifest.xml文件中也有该条目。所以,我重新启动了模拟器,然后就好了。 - larryq
请记得重新启动模拟器以使其生效。 - FlyingSnowGhost

21

如果您在使用模拟器,请确保移动数据处于活动状态。


3
这是对我有效的方法。我必须关闭 WiFi,仅依赖数据。我已经添加了 <uses-permission android:name="android.permission.INTERNET" /> 权限。 - Alicester4WonderlandPresident
2
这种情况也发生在我身上。如果添加INTERNET权限无法解决问题,请尝试关闭并重新启动模拟器。 - Sumit

16

您可以尝试以下操作:

如果应用程序在调试模式下运行正常,但在发布模式下不工作,则可能涉及权限问题,请在清单文件中添加权限(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" />

如果调试模式无法正常工作,请通过Postman检查您的url是否正确。如果它在Postman中能够运行,则应以以下方式执行您的webservice:

在pubspec.yaml中添加依赖项:

dependencies:
  flutter:
    sdk: flutter

  http: 0.13.3

在添加http:0.13.3后,点击Pub get按钮。如果它执行的代码为0,则表示已成功将其添加到您的项目中。

在您的Dart文件中导入http.dart:

import 'package:http/http.dart';

现在编写以下代码来执行Web服务:

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. 
}

我希望这可以帮到你。放松点!


这真的帮了我很多!我忘记在主要部分添加权限了。 - undefined

12

进入AVD管理器,选择你的模拟器,在“操作”菜单中点击向下箭头图标,然后选择"擦除数据",最后重启模拟器即可。我已经成功实践过了。


3
这个答案对我很有帮助,非常好,谢谢。 - Yasir Hantoush
3
我先升级了Flutter并在AVD管理器中清除了模拟器数据。 它有效了。 - G.S Dash

7

在我的情况下,在我连接到系统的WIFI之前,我打开了模拟器。当网络(WIFI)已连接到我的系统但无法连接到模拟器时会出现此问题。

由于模拟器没有互联网访问权限,所以会出现这些问题。我通过以下方式解决了这些问题:

解决方案:

连接系统的网络访问权限,然后关闭模拟器并重新打开它。安装应用程序,运行应用程序并打开它。最终,每个API都可以正常工作。


1
开,这个解决了我的问题,异常一直持续出现了一个星期,我刚刚才知道是因为我的模拟器没有连接,因为它在我连接电脑到网络之前就启动了。 - Peter Akwa
1
@PeterAkwa 这是主要的原因。 - Rahul Kushwaha
1
@PeterAkwa 这就是主要原因。 - undefined

7

我也遇到了同样的问题。我重新启动了模拟器,问题解决了!


2
请仔细检查您的措辞,“即使我...”。对于语言背景不同的读者来说,这样的表达方式听起来很奇怪,可能会被误解为不尊重的言论(尽管需要一些努力)。 - Yunnosch
非常感谢,您的答案帮助了我不止一次。 - Mosa

6

我的情况是因为我的手机没有连接互联网

只需启用互联网连接即可


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接