이 오류는 정말 정말 이상합니다. 검색을 많이했지만 유용하지 않았기 때문에 재현 방법과 수정 방법을 모르겠습니다.
다음은 스택 추적입니다.
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>
이 앱이 출시 된 지 2 년이 지났으므로 매니페스트에 올바른 인터넷 권한이 있는지 물어 보지 마세요.
또한 모든 버그가 Android 4.1.x 버전 (JB)에서 발생하는 것으로 나타났습니다. 기기가 루팅되었는지 또는 무엇인지 모르겠습니다 (현재이 정보를 볼 수 없습니다).
답변
참고 :이 답변은 2013 년 6 월에 작성했기 때문에 요즘 약간 날짜가 있습니다. 버전 6 (Marshmallow) 이후 Android 플랫폼에서 많은 사항이 변경되어 요즘에는 전체 문제가 점점 더 사라졌습니다. 그러나이 게시물은 일반적인 문제 분석 접근 예제로 여전히 읽을 가치가 있다고 생각합니다.
예외 ( SecurityException: Permission denied (missing INTERNET permission?)
)는 네트워킹을 할 수 없음을 명확하게 나타냅니다. 그것은 명백한 사실입니다. 그러나 이것이 어떻게 일어날 수 있습니까? 일반적으로 파일에 <uses-permission android:name="android.permission.INTERNET" />
항목 이 누락되었거나 AndroidManifest.xml
런타임이 아닌 설치시 인터넷 권한이 부여 되었기 때문에 오랫동안 Android 프레임 워크에서 누락 된 버그로 인해 앱이 성공적으로 설치되었지만 예상되는 권한 부여가 없었기 때문입니다.
내 매니페스트가 정확합니다. 어떻게 이런 일이 발생할 수 있습니까?
이론적으로 존재 uses-permission
으로 매니페스트의 요구 사항을 완벽하게 충족하며 개발자의 관점에서 네트워킹을 수행하기 위해 수행해야하는 모든 것입니다. 또한 설치 중에 사용자에게 권한이 표시되기 때문에 앱이 사용자의 기기에 설치를 종료했다는 사실은 사용자가 요청한 것을 승인했음을 의미하므로 (그렇지 않으면 설치가 취소됨) 코드가 실행되면 요청 된 모든 권한이 다음과 같다고 가정합니다. 부여는 유효합니다. 그리고 일단 부여되면 표준 Android 프레임 워크 (AOSP에서)가 현재 그러한 기능을 제공하지 않기 때문에 사용자는 앱을 완전히 제거하는 것 외에 다른 방법으로 권한을 취소 할 수 없습니다.
그러나 앱이 루팅 된 기기에서도 실행되는 것을 신경 쓰지 않는다면 상황이 더 까다로워지고 있습니다. Google Play에는 사용자가 런타임 에 설치된 앱 에 부여 된 권한을 제어하기 위해 설치할 수있는 도구가 있습니다 ( 예 : 권한 거부 됨 및 기타). 이는 또한 CyanogenMod , 벤더 브랜드 (예 : LG) 또는 다양한 유형의 “개인 정보 보호 관리자”또는 유사한 도구를 특징으로하는 기타 사용자 정의 ROM 으로 수행 할 수 있습니다 .
따라서 앱이 어느 쪽이든 차단되면 기본적으로 사용자에 의해 의도적으로 차단되고 만약 그렇다면이 경우에 사용자 문제가 더 많습니다 (또는 특정 옵션 / 도구가 실제로 무엇을하고 어떤 결과가 발생할지 이해하지 못함). 표준 SDK (및 대부분의 앱은 해당 SDK를 염두에두고 작성 됨)가 그렇게 작동하지 않기 때문입니다. 나는 그래서 강력하게 이 문제가 ROM (삼성, HTC, 소니 등과 같은 또는 공급 업체), “표준”비 뿌리 재고와 장치에서 발생 의심한다.
나는 충돌하고 싶지 않다 …
적절하게 구현 된 권한 관리 및 / 조직 차단은 대부분의 앱이 특정 기능에 대한 액세스 권한이 부여되고 동시에 액세스 할 수없는 상황에 대비할 수 없다는 사실을 처리해야합니다. 이는 앱이 매니페스트를 사용하는 일종의 모순이기 때문입니다. 설치시 액세스를 요청하십시오. 올바른 액세스 제어는 모든 것이 이전과 같이 작동하도록해야하며 기능의 예상 동작 범위 내에서 기술을 사용하여 사용성을 제한해야합니다. 예를 들어 특정 권한이 부여되면 (예 : GPS, 인터넷 액세스) 이러한 기능을 앱 / 사용자 관점에서 사용할 수 있습니다 (예 : GPS를 켜거나 연결을 시도 할 수 있음). 변경된 구현은 실제 데이터를 제공하지 않을 수 있습니다. 즉, GPS는 실내에 있거나 위성 “수정”이 없을 때와 같이 항상 좌표를 반환하지 않습니다. 이전과 마찬가지로 인터넷 액세스를 허용 할 수 있습니다. 그러나 데이터 커버리지 나 라우팅이 없기 때문에 성공적으로 연결할 수 없습니다. 이러한 시나리오는 정상적인 사용에서도 예상되어야하므로 이미 앱에서 처리해야합니다. 이것은 일상적인 사용 중에 단순히 발생할 수 있으므로 이러한 상황에서 발생하는 모든 충돌은 응용 프로그램 버그와 관련이있을 가능성이 큽니다.
추측없이 문제를 진단하기 위해이 문제가 발생하는 환경에 대한 정보가 너무 많지 않지만 일종의 해결책으로 사용을 고려할 수 있습니다. setDefaultUncaughtExceptionHandler () 를 향후 이러한 예상치 못한 예외를 포착하고 사용자에게 어떤 권한이 있는지에 대한 자세한 정보를 표시하는 앱이 단지 충돌하는 대신 필요합니다. 이것을 사용하면 크 리터 시즘, ACRA 및 기타 도구와 충돌 할 가능성이 높으므로 이러한 도구를 사용하는 경우주의해야합니다.
노트
양해하여 주시기 바랍니다 android.permission.INTERNET
당신이 성공적으로 네트워킹 할 수있는 시도 매니페스트에 선언해야 할 수있는 유일한 네트워킹 관련 권한이 아니다. 갖는 INTERNET
부여 된 권한이 단순히 (모든 네트워크 데이터 전송을 할 수있는 기본적인 요구 사항은 기본적으로있는) 개방형 네트워크 소켓 응용 프로그램을 할 수 있습니다. 그러나 네트워크 스택 / 라이브러리가 네트워크에 대한 정보를 얻으려는 경우 android.permission.ACCESS_NETWORK_STATE
Manifest 도 필요 합니다 (예 : HttpUrlConnection 클라이언트에 필요합니다 ( tutorial 참조). ).
부록 (2015-07-16)
Android 6 (일명 Marshmallow)는 Runtime Permissions 라는 완전히 새로운 권한 관리 메커니즘을 도입했습니다 . 사용자에게 부여되는 권한 (선택적 부여도 허용)에 대한 더 많은 제어를 제공하거나 앱 제거없이 이미 부여 된 권한을 취소 할 수 있습니다.
이 […]는 사용자가 이제 런타임에 앱 권한을 직접 관리 할 수있는 새로운 권한 모델을 소개합니다. 이 모델은 사용자에게 향상된 가시성과 권한 제어를 제공하는 동시에 앱 개발자를위한 설치 및 자동 업데이트 프로세스를 간소화합니다. 사용자는 설치된 앱에 대해 개별적으로 권한을 부여하거나 취소 할 수 있습니다.
그러나 변경 사항은 INTERNET
또는ACCESS_NETWORK_STATE
“일반”권한으로 간주되는 권한에 . 사용자는 이러한 권한을 명시 적으로 부여 할 필요가 없습니다.
자세한 내용은 동작 변경 설명 페이지를 참조하고 앱이 최신 시스템에서도 올바르게 작동하는지 확인하십시오. 새 권한 모델을 지원 해야 하기 때문에 프로젝트 targetSdk
가 최소한 23
으로 설정된 경우 특히 중요 합니다 ( 상세 문서 ). 아직 준비가되지 않았다면 앱이 설치 될 때 새로운 Android에서도 이전 권한 시스템을 사용할 수 있도록 targetSdk
최대한 유지 22
하세요.
답변
추가하는 장소가
<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"/>
내 실수하지 마세요 🙂
답변
Android Studio 1.3b1 (다른 버전에 대해서는 확실하지 않음)이 ANDROID.PERMISSION.INTERNET
. android.permission.INTERNET
문제를 해결 하도록 변경했습니다 .
답변
매니페스트 파일에 다음 줄을 추가합니다.
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
그것은 나를 위해 그것을 고쳤습니다.
답변
이 오류를 해결하고 실수로 Application 태그 내에 권한을 추가했습니다. 나는 밖에 퍼팅했는데 잘 작동합니다. 누군가에게 도움이되기를 바랍니다.
답변
나도이 문제가 있었다. 내 롤리팝 에뮬레이터에서 작동했지만 실제 kitkat 장치에서는 작동하지 않는 것이 이상했습니다.
Android Studio는 이제 권한 대문자를 작성하도록 강제합니다. 그게 문제입니다.
더하다
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
응용 프로그램 탭 위에 있으면 작동합니다.
답변
아래와 같이 애플리케이션 태그 앞에 허가를 작성하십시오.
<?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">