このエラーは本当に本当に奇妙で、多くの検索を行ったが何も役に立たなかったため、その再現方法と修正方法がわかりません。
スタックトレースは次のとおりです。
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)から発生していることにも気付きました。デバイスがルート化されているかどうか、または何を知っているか(現時点ではこの情報を見ることができません)
注:この回答は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でもアプリのインストール時に古い許可システムが使用されます。
必ず追加する場所
<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"/>
それは私のためにそれを修正しました。
このエラーを解決しましたが、誤ってアプリケーションタグ内に権限を追加していました。私は外にパットし、それはうまく動作します。それが誰かに役立つことを願っています。
私もこの問題を抱えていました。 Lollipopエミュレータで動作するのは奇妙でしたが、実際の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">
これらの許可をタグの前の<application>
タグの外に置き、試してみたところうまくいきました。
<uses-permission Android:name="Android.permission.INTERNET" />
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE"/>
iPv6アドレスの場合は、これをご覧ください: https://code.google.com/p/Android/issues/detail?id=33046
4.3(?)で修正されたAndroidにバグがあったようです。
トムが言ったように。大文字A
で開始すると、オートコンプリートはそれを完了します。
Android.PERMISSION.INTERNET
a
で入力を開始すると、オートコンプリートは次のように完了します。
Android.permission.INTERNET
2番目は正しいものです。
それは非常に紛らわしい種類のバグです。多くの理由が考えられます。
私はこの問題の解決策を探すのに何時間も費やしましたが、答えの解決策はどれもうまくいきませんでした。その後、オートコンプリート中にAndroid.permission.INTERNET
と"
の間に誤ってスペースを追加したことがわかりました