[android] SecurityException : 권한이 거부되었습니다 (인터넷 권한이 없습니까?)

이 오류는 정말 정말 이상합니다. 검색을 많이했지만 유용하지 않았기 때문에 재현 방법과 수정 방법을 모르겠습니다.

다음은 스택 추적입니다.

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_STATEManifest 도 필요 합니다 (예 : 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">