web-dev-qa-db-ja.com

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年前から市場に出回っているので、マニフェストに適切なインターネットアクセス許可があるかどうかを確認する必要はありません。

また、(Crittercismから)すべてのバグがAndroid 4.1.xバージョン(JB)から発生していることにも気付きました。デバイスがルート化されているかどうか、または何を知っているか(現時点ではこの情報を見ることができません)

86
StErMi

注:この回答は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から)は現時点ではそのような機能を提供していないため、一度許可されると、ユーザーはアプリを完全にアンインストールする以外の方法で許可を取り消すことはできません。

ただし、アプリを rooted デバイスで実行することも気にしない場合は、事態はさらに難しくなります。 Google Playで利用可能なツールを使用して、インストールされたアプリに実行時に許可される権限を制御するためにインストールできます-例: Permissions拒否 およびその他。これは、 CyanogenMod 、ベンダーブランド(LGなど)または その他のカスタムROM を使用して行うこともでき、さまざまなタイプの「プライバシーマネージャー」または同様のツールを備えています。

そのため、アプリがいずれかの方法でブロックされた場合、基本的にユーザーによって意図的にブロックされます。もしそうであれば、この場合はユーザーの問題になります(または、特定のオプション/ツールが実際に何をし、結果がどうなるかを理解していません)標準のSDK(およびほとんどのアプリはそのSDKを念頭に置いて書かれている)がそのように動作しないためです。だから、私は強くこの問題が「標準」の、ルートのないデバイス(またはSamsung、HTC、Sonyなどのベンダー)ROMで発生することを疑います。

クラッシュしたくない...

適切に実装された許可管理および/または組織のブロックは、特定の機能へのアクセスが同時に許可されない状況にほとんどのアプリが対応できない場合があるという事実に対処する必要があります。これは、アプリがインストール時にアクセスを要求します。アクセス制御が適切に行われると、すべてが以前と同様に機能し、機能の期待される動作の範囲内でテクニックを使用する使いやすさが制限されます。たとえば、特定の許可(GPS、インターネットアクセスなど)が許可されている場合、そのような機能はアプリ/ユーザーの観点から利用可能になります(つまり、GPSをオンにしたり、接続を試みることができます)、変更された実装は実際のデータを提供できません-すなわち、屋内にいるときや衛星の「修正」がないときなど、GPSは常に座標を返すことができません。インターネットアクセスは以前と同じように許可できますが、データカバレッジやルーティングがないため、正常に接続できません。このようなシナリオは通常の使用でも同様に予想されるため、既にアプリで処理する必要があります。これは通常の毎日の使用中に発生する可能性があるため、このような状況でのクラッシュはアプリケーションのバグに関連している可能性が高いはずです。

推測なしで問題を診断するには、この問題が発生する環境に関する情報が多すぎますが、一種の解決策として、将来的にそのような予期しない例外をキャッチするために setDefaultUncaughtExceptionHandler() を使用することを検討できます単にクラッシュするのではなく、ユーザーの詳細情報を表示して、アプリに必要な許可を与えるだけです。これを使用すると、Crittercism、ACRAなどのツールと競合する可能性が高いため、これらのいずれかを使用する場合は注意してください。

Android.permission.INTERNETは、ネットワーキングを正常に行うためにマニフェストで宣言する必要がある唯一のネットワーク関連の許可ではないことに注意してください。 INTERNETパーミッションを付与すると、アプリケーションがネットワークソケットを開くことができます(これは基本的に、ネットワークデータ転送を行うための基本的な要件です)。ただし、ネットワークスタック/ライブラリがネットワークに関する情報も取得したい場合は、マニフェストにAndroid.permission.ACCESS_NETWORK_STATEも必要です(つまり、 HttpUrlConnection client( チュートリアルを参照 )。


補遺(2015-07-16)

Android 6(別名Marshmallow)では、Runtime Permissionsと呼ばれる完全に新しいアクセス許可管理メカニズムが導入されました。許可する権限をユーザーがより細かく制御できるようにし(選択的な許可も可能)、アプリの削除が不要な既に許可された権限を取り消すこともできます。

これにより、ユーザーが実行時にアプリの権限を直接管理できる新しい権限モデルが導入されます。このモデルにより、ユーザーはアプリ開発者のインストールと自動更新プロセスを合理化しながら、アクセス許可の可視性と制御を改善できます。ユーザーは、インストールされたアプリの権限を個別に付与または取り消すことができます。

ただし、変更はINTERNETまたはACCESS_NETWORK_STATEアクセス許可には影響しません。これらのアクセス許可は「通常」のアクセス許可と見なされます。ユーザーはこれらの許可を明示的に付与する必要はありません。

詳細については behavior changes description ページを参照し、アプリが新しいシステムでも正しく動作することを確認してください。プロジェクトがtargetSdkを少なくとも23に設定した場合、特に重要ですmustは新しい権限モデルをサポートします(- 詳細なドキュメント )。準備ができていない場合は、targetSdkを最大22に維持してください。これにより、新しいAndroidでもアプリのインストール時に古い許可システムが使用されます。

114
Marcin Orlowski

必ず追加する場所

<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"/>

私の間違いをしないでください:)

34
Valeria

Android Studio 1.3b1(他のバージョンについては不明)は、Android.PERMISSION.INTERNETへのインターネット許可をオートコンプリートしました。 Android.permission.INTERNETに変更すると、問題が修正されました。

33
Tom

マニフェストファイルに次の行を追加します。

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

それは私のためにそれを修正しました。

28
Dashtank

このエラーを解決しましたが、誤ってアプリケーションタグ内に権限を追加していました。私は外にパットし、それはうまく動作します。それが誰かに役立つことを願っています。

19
Sami

私もこの問題を抱えていました。 Lollipopエミュレータで動作するのは奇妙でしたが、実際のKitKatデバイスでは動作しませんでした。

Android Studioは、許可の大文字を書くことを強制するようになりました。それが問題です。

追加

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

[アプリケーション]タブの上で、動作します。

15
Boldijar Paul

以下に示すように、アプリケーションタグの前に許可を書いてください。

<?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">
9
arango_86

これらの許可をタグの前の<application>タグの外に置き、試してみたところうまくいきました。

<uses-permission Android:name="Android.permission.INTERNET" />
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE"/>
4
Tobore Igbe

iPv6アドレスの場合は、これをご覧ください: https://code.google.com/p/Android/issues/detail?id=33046

4.3(?)で修正されたAndroidにバグがあったようです。

2
Benjamin Foster

トムが言ったように。大文字Aで開始すると、オートコンプリートはそれを完了します。

Android.PERMISSION.INTERNET

aで入力を開始すると、オートコンプリートは次のように完了します。

Android.permission.INTERNET

2番目は正しいものです。

2
Shakti

それは非常に紛らわしい種類のバグです。多くの理由が考えられます。

  1. 適切な場所で権限について言及していません。アプリケーションのすぐ上のように。
  2. 小文字を使用していません。
  3. 場合によっては、ネットワーク状態の許可も追加する必要があります。
  4. 私の場合、マニフェスト行にいくつかの空白行があります。許可タグとアプリケーション行の間に空白行があるかもしれないように。それらを削除すれば完了です。それが役立つことを願っています
0
Shami

私はこの問題の解決策を探すのに何時間も費やしましたが、答えの解決策はどれもうまくいきませんでした。その後、オートコンプリート中にAndroid.permission.INTERNET"の間に誤ってスペースを追加したことがわかりました

0
a2en