101

这个错误真的很奇怪,我不知道如何重现它以及如何修复它,因为我进行了很多搜索但没有任何用处。

这是堆栈跟踪:

Stack Trace
_________________________________
0   java.lang.RuntimeException: An error occured while executing doInBackground()
1       at android.os.AsyncTask$3.done(AsyncTask.java:299)
2       at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
3       at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
4       at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
5       at java.util.concurrent.FutureTask.run(FutureTask.java:137)
6       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
7       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
8       at java.lang.Thread.run(Thread.java:856)
9   Caused by: java.lang.SecurityException: Permission denied (missing INTERNET permission?)
10      at java.net.InetAddress.lookupHostByName(InetAddress.java:430)
11      at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
12      at java.net.InetAddress.getAllByName(InetAddress.java:214)
13      at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
14      at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
15      at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
16      at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
17      at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
18      at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316)
19      at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:461)
20      at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433)
21      at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)
22      at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)
23      at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:292)
24      at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:185)
25      at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:271)
26      at com.designfuture.music.api.MusixMatchApi.sendRequestJSON(MusixMatchApi.java:1143)
27      at com.designfuture.music.api.MusixMatchApi.handleRequestJSON(MusixMatchApi.java:982)
28      at com.designfuture.music.api.MusixMatchApi.getConfig(MusixMatchApi.java:211)
29      at com.designfuture.music.asynctask.GetConfigAsyncTask.doInBackground(GetConfigAsyncTask.java:28)
30      at com.designfuture.music.asynctask.GetConfigAsyncTask.doInBackground(GetConfigAsyncTask.java:1)
31      at android.os.AsyncTask$2.call(AsyncTask.java:287)
32      at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
33      ... 4 more
34  Caused by: libcore.io.GaiException: getaddrinfo failed: EAI_NODATA (No address associated with hostname)
35      at libcore.io.Posix.getaddrinfo(Native Method)
36      at libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.java:55)
37      at java.net.InetAddress.lookupHostByName(InetAddress.java:405)
38      ... 26 more
39  Caused by: libcore.io.ErrnoException: getaddrinfo failed: EACCES (Permission denied)
40      ... 29 more
41  java.lang.SecurityException: Permission denied (missing INTERNET permission?)
42      at java.net.InetAddress.lookupHostByName(InetAddress.java:430)
43      at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
44      at java.net.InetAddress.getAllByName(InetAddress.java:214)
45      at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
46      at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
47      at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
48      at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
49      at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
50      at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316)
51      at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:461)
52      at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433)
53      at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)
54      at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)
55      at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:292)
56      at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:185)
57      at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:271)
58      at com.designfuture.music.api.MusixMatchApi.sendRequestJSON(MusixMatchApi.java:1143)
59      at com.designfuture.music.api.MusixMatchApi.handleRequestJSON(MusixMatchApi.java:982)
60      at com.designfuture.music.api.MusixMatchApi.getConfig(MusixMatchApi.java:211)
61      at com.designfuture.music.asynctask.GetConfigAsyncTask.doInBackground(GetConfigAsyncTask.java:28)
62      at com.designfuture.music.asynctask.GetConfigAsyncTask.doInBackground(GetConfigAsyncTask.java:1)
63      at android.os.AsyncTask$2.call(AsyncTask.java:287)
64      at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
65      at java.util.concurrent.FutureTask.run(FutureTask.java:137)
66      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
67      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
68      at java.lang.Thread.run(Thread.java:856)
69  Caused by: libcore.io.GaiException: getaddrinfo failed: EAI_NODATA (No address associated with hostname)
70      at libcore.io.Posix.getaddrinfo(Native Method)
71      at libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.java:55)
72      at java.net.InetAddress.lookupHostByName(InetAddress.java:405)
73      ... 26 more
74  Caused by: libcore.io.ErrnoException: getaddrinfo failed: EACCES (Permission denied)
75      ... 29 more
76  libcore.io.GaiException: getaddrinfo failed: EAI_NODATA (No address associated with hostname)
77      at libcore.io.Posix.getaddrinfo(Native Method)
78      at libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.java:55)
79      at java.net.InetAddress.lookupHostByName(InetAddress.java:405)
80      at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
81      at java.net.InetAddress.getAllByName(InetAddress.java:214)
82      at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
83      at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
84      at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
85      at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
86      at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
87      at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316)
88      at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:461)
89      at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433)
90      at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)
91      at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)
92      at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:292)
93      at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:185)
94      at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:271)
95      at com.designfuture.music.api.MusixMatchApi.sendRequestJSON(MusixMatchApi.java:1143)
96      at com.designfuture.music.api.MusixMatchApi.handleRequestJSON(MusixMatchApi.java:982)
97      at com.designfuture.music.api.MusixMatchApi.getConfig(MusixMatchApi.java:211)
98      at com.designfuture.music.asynctask.GetConfigAsyncTask.doInBackground(GetConfigAsyncTask.java:28)
99      at com.designfuture.music.asynctask.GetConfigAsyncTask.doInBackground(GetConfigAsyncTask.java:1)
100     at android.os.AsyncTask$2.call(AsyncTask.java:287)
101     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
102     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
103     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
104     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
105     at java.lang.Thread.run(Thread.java:856)
106 Caused by: libcore.io.ErrnoException: getaddrinfo failed: EACCES (Permission denied)
107     ... 29 more
108 libcore.io.ErrnoException: getaddrinfo failed: EACCES (Permission denied)
109     at libcore.io.Posix.getaddrinfo(Native Method)
110     at libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.java:55)
111     at java.net.InetAddress.lookupHostByName(InetAddress.java:405)
112     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
113     at java.net.InetAddress.getAllByName(InetAddress.java:214)
114     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
115     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
116     at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
117     at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
118     at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
119     at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316)
120     at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:461)
121     at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433)
122     at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)
123     at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)
124     at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:292)
125     at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:185)
126     at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:271)
127     at com.designfuture.music.api.MusixMatchApi.sendRequestJSON(MusixMatchApi.java:1143)
128     at com.designfuture.music.api.MusixMatchApi.handleRequestJSON(MusixMatchApi.java:982)
129     at com.designfuture.music.api.MusixMatchApi.getConfig(MusixMatchApi.java:211)
130     at com.designfuture.music.asynctask.GetConfigAsyncTask.doInBackground(GetConfigAsyncTask.java:28)
131     at com.designfuture.music.asynctask.GetConfigAsyncTask.doInBackground(GetConfigAsyncTask.java:1)
132     at android.os.AsyncTask$2.call(AsyncTask.java:287)
133     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
134     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
135     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
136     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
137     at java.lang.Thread.run(Thread.java:856)

这是我的 AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="my_app_package"
    android:installLocation="auto"
    android:versionCode="my_version_code"
    android:versionName="my_version_name" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="16" />

    <supports-screens
        android:anyDensity="true"
        android:largeScreens="true"
        android:normalScreens="true"
        android:resizeable="true"
        android:smallScreens="true"
        android:xlargeScreens="true" />

    <uses-feature android:glEsVersion="0x00010001" />

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

    <application
        android:allowTaskReparenting="true"
        android:debuggable="true"
        android:icon="@drawable/mxm_icon"
        android:label="@string/musicbrowserlabel"
        android:theme="@style/Theme.Music" >

        <!-- MY ACTIVITIES -->



    </application>

</manifest>

请不要问我清单中是否有正确的 INTERNET 权限,因为这个应用程序已经上市 2 年了:P

我还注意到(来自 Crittercism)所有错误都来自 Android 4.1.x 版本(JB)。我不知道设备是否已植根或什么(我暂时看不到此信息)

4

13 回答 13

124

注意:我在 2013 年 6 月写了这个答案,所以现在有点过时了。自第 6 版(Marshmallow,2015 年底发布)以来,Android 平台发生了许多变化,使整个问题或多或少地过时了。但是我相信这篇文章作为一般问题分析方法的例子仍然值得一读。


你得到的异常(SecurityException: Permission denied (missing INTERNET permission?)),清楚地表明你不允许做网络。这是相当不争的事实。但这怎么会发生呢?通常是由于<uses-permission android:name="android.permission.INTERNET" />您的文件中缺少条目,或者由于AndroidManifest.xml在安装时而不是在运行时授予互联网权限,由于长期存在的 Android 框架中遗漏的错误导致您的应用程序成功安装,但没有预期的权限授予。

我的清单是正确的,那怎么会发生呢?

从理论上讲,uses-permissionManifest 中的存在完美地满足了要求,并且从开发人员的角度来看,这就是能够进行联网所需要做的一切。此外,由于在安装过程中会向用户显示权限,因此您的应用程序最终安装在用户设备上的事实意味着他/她授予了您所要求的(否则安装被取消),因此假设如果您的代码被执行,那么所有请求的权限都是授予有效。并且一旦授予,用户除了完全卸载应用程序之外无法撤销权限,因为标准 Android 框架(来自 AOSP)目前不提供此类功能。

但是,如果您也不介意您的应用程序也在有设备上运行,那么事情就会变得更加棘手。您的用户可以在 Google Play 中安装一些工具来控制在运行时授予已安装应用程序的权限- 例如:Permissions Denied等。这也可以通过CyanogenMod、供应商品牌(即 LG 的)或其他自定义 ROM来完成,这些 ROM 具有各种类型的“隐私管理器”或类似工具。

因此,如果应用程序以任何一种方式被阻止,它基本上是由用户故意阻止的,如果是这样,在这种情况下确实是更多的用户问题(或者她/他不明白某些选项/工具的真正作用以及后果是什么)比你的,因为标准 SDK(和大多数应用程序都是在考虑该 SDK 的情况下编写的)根本不会那样做。所以我强烈怀疑这个问题发生在“标准”、非根设备上,带有库存(或三星、HTC、索尼等供应商)ROM。

我不想崩溃...

正确实施的权限管理和/组织阻止必须处理这样一个事实,即大多数应用程序可能还没有准备好同时授予和不可访问某些功能的情况,因为这与应用程序使用清单的矛盾在安装时请求访问。正确完成的访问控制必须使所有事情都像以前一样工作,并且仍然在功能的预期行为范围内使用技术限制可用性。例如,当授予某些权限(即 GPS、互联网访问)时,可以从应用程序/用户的角度提供此类功能(即您可以打开 GPS。或尝试连接),更改后的实现不能提供真实数据 -即 GPS 总是可以不返回坐标,例如当您在室内或没有卫星“修复”时。可以像以前一样授予互联网访问权限,但是您无法成功连接,因为没有数据覆盖或路由。在正常使用中也应该预料到这种情况,因此它应该已经由应用程序处理。由于这很可能在日常正常使用中发生,因此在这种情况下的任何崩溃都应该很可能与应用程序错误有关。

我们缺乏关于发生此问题的环境的太多信息来诊断问题而无需猜测,但作为一种解决方案,您可以考虑使用setDefaultUncaughtExceptionHandler()来捕获未来此类意外异常,即简单地向用户显示详细信息什么权限您的应用需要,而不仅仅是崩溃。请注意,使用它很可能会与 Crittercism、ACRA 等工具发生冲突,因此在使用这些工具时要小心。

笔记

请注意,这android.permission.INTERNET不是您可能需要在清单中声明以尝试成功建立网络的唯一网络相关权限。授予INTERNET权限只是允许应用程序打开网络套接字(这基本上是进行任何网络数据传输的基本要求)。但是,如果您的网络堆栈/库也想获取有关网络的信息,那么您还需要android.permission.ACCESS_NETWORK_STATE在清单中(即HttpUrlConnection客户端所需的(参见教程)。


附录 (2015-07-16)

请注意,Android 6(又名 Marshmallow)引入了全新的权限管理机制,称为Runtime Permissions。它使用户可以更好地控制授予的权限(也允许选择性授予)或让用户撤销已授予的权限而无需删除应用程序:

这个 [...] 引入了一种新的权限模型,用户现在可以在运行时直接管理应用程序权限。该模型为用户提供了改进的可见性和权限控制,同时为应用程序开发人员简化了安装和自动更新过程。用户可以单独授予或撤销已安装应用程序的权限。

但是,这些更改不会影响INTERNETACCESS_NETWORK_STATE权限,这些权限被视为“正常”权限。用户不需要明确授予这些权限。

有关详细信息,请参阅行为更改描述页面,并确保您的应用程序在较新的系统上也能正常运行。当您的项目targetSdk至少设置23为您必须支持新的权限模型(详细文档)时,这一点尤其重要。如果您还没有准备好,请确保您targetSdk最多保留,22因为这样可以确保即使是新的 Android 在安装您的应用程序时也会使用旧的权限系统。

于 2013-06-28T09:01:20.270 回答
52

确保你添加的地方

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

是正确的。

你应该在 AndroidManifest.xml 中这样写:

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

不要犯我的错误:)

于 2016-02-02T18:42:13.850 回答
34

Android Studio 1.3b1(不确定其他版本)自动完成了我对ANDROID.PERMISSION.INTERNET. 更改它以android.permission.INTERNET解决问题。

于 2015-07-16T22:37:25.130 回答
31

在清单文件中添加以下行:

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

它为我修好了。

于 2014-06-17T18:49:58.777 回答
20

我解决了这个错误,我错误地在 Application 标签中添加了权限。我把它放在外面,它工作正常。希望它对某人有所帮助。

于 2015-05-10T19:39:54.057 回答
17

我也有这个问题。奇怪的是,它可以在我的棒棒糖模拟器上运行,但在我实际的 kitkat 设备上却不行。

Android Studio 现在会强制你将权限写成大写,这就是问题所在。

添加

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

在应用程序选项卡上方,它将起作用。

于 2015-07-07T13:45:26.377 回答
17

在应用程序标签之前写下您的许可,如下所示。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.someapp.sample">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
于 2016-10-18T17:41:27.363 回答
4

将这些权限放在<application>标签之外,最好放在标签之前,我试过了,它对我有用。

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
于 2015-12-19T00:50:51.197 回答
2

如果它是 IPv6 地址,请查看:https ://code.google.com/p/android/issues/detail?id=33046

看起来 Android 中存在一个在 4.3(?)中修复的错误。

于 2013-11-01T17:45:00.977 回答
2

就像汤姆提到的那样。当您从大写开始时,A自动完成将完成它。

ANDROID.PERMISSION.INTERNET

当您开始输入时,a自动完成将完成它

android.permission.INTERNET

第二个是正确的。

于 2015-07-17T11:28:29.940 回答
2

我花了几个小时寻找这个问题的解决方案,但答案中的解决方案都没有奏效。然后我发现我在自动完成过程中不小心在android.permission.INTERNET和之间添加了一个空格"

于 2019-01-22T04:43:07.720 回答
0

嗯,这是一种非常令人困惑的错误。可能有很多原因:

  1. 您没有在正确的位置提及权限。就像上面的应用程序一样。
  2. 您没有使用小写字母。
  3. 在某些情况下,您还必须添加网络状态权限。
  4. 一个是我的情况,清单行中有一些空白行。就像权限标签和申请行之间可能有一个空行一样。删除它们,你就完成了。希望它会有所帮助
于 2017-01-25T23:43:22.357 回答
-7

在清单文件中删除它

 xmlns:tools="http://schemas.android.com/tools"
于 2016-05-16T09:33:25.297 回答