[解決済み] SecurityExceptionです。パーミッションが拒否されました(INTERNETパーミッションがない?)
質問
このエラーは本当に本当に奇妙で、再現する方法と修正する方法がわかりません。
これがスタックトレースです。
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年前から市場に出ているので、私のマニフェストに正しいインターネット許可があるかどうか、わざわざ聞かないでください :P
また、(Crittercismから)すべてのバグはAndroid 4.1.xバージョン(JB)から来ていることに気づきました。端末がroot化されているかどうかはわかりません(今のところこの情報を見ることはできません)
解決方法は?
注:この回答は2013年6月に書いたものなので、今となっては少し古くなっています。バージョン6(Marshmallow、2015年末リリース)以降、Androidプラットフォームでは多くのことが変わり、問題全体が多かれ少なかれ時代遅れになっています。しかし、私はこの投稿が一般的な問題分析アプローチの例として、まだ読む価値があると信じています。
取得した例外(
SecurityException: Permission denied (missing INTERNET permission?)
) は、明らかにネットワーク接続が許可されていないことを示しています。これは紛れもない事実です。しかし、どうしてこのようなことが起こるのでしょうか?通常は
<uses-permission android:name="android.permission.INTERNET" />
のエントリに
AndroidManifest.xml
または、インターネットアクセス許可は実行時ではなくインストール時に付与されるため、Androidフレームワークの長年のバグにより、アプリは正常にインストールされるものの、期待したアクセス許可が付与されないことが原因です。
私のマニフェストは正しいのに、どうしてこんなことが起こるのでしょうか?
理論的には
uses-permission
のマニフェストで要件を完全に満たしており、開発者の立場からすれば、ネットワーキングを行うために必要なことはすべて揃っています。さらに、パーミッションはインストール時にユーザーに表示されるため、ユーザーのデバイスにアプリがインストールされたということは、ユーザーが要求したことを許可したということです(そうでなければインストールはキャンセルされます)。したがって、コードが実行されれば、要求したすべてのパーミッションが許可されるという仮定は有効です。そして、一度許可されると、ユーザーはアプリを完全にアンインストールする以外の方法でその許可を取り消すことができません。
しかし、もしあなたが自分のアプリが ルーツ の端末もあります。Google Playには、インストールされたアプリに付与される権限を制御するためのツールが用意されています。 実行時 - 例えば パーミッションの拒否 などがあります。また、これは シアノジェンモッド は、ベンダーブランド(例:LGのもの)または その他のカスタムROM 様々なタイプのプライバシーマネージャーや類似のツールを備えています。
このような場合、標準的なSDK(そしてほとんどのアプリはそのSDKを念頭に置いて書かれている)はそのように動作しないので、もしアプリがブロックされるなら、それは基本的にユーザーが意図的にブロックしているのであって、そうなら、それはあなたよりもユーザーの問題です(またはその人は特定のオプションやツールが実際に何をするのか、その結果はどうなるのか理解していないのです)。そこで私は 強く この問題は、標準的な非root化デバイスで、純正(またはSamsung、HTC、Sonyなどのベンダー)ROMを使用した場合に発生するものではありません。
クラッシュしたくないのですが・・・。
適切に実装された権限管理および/またはgブロックは、アプリがインストール時にマニフェストを使用してアクセスを要求するという一種の矛盾であるため、ほとんどのアプリが特定の機能へのアクセスを許可すると同時にアクセスできない状況に対応する準備ができていない可能性があるという事実に対処する必要があります。アクセス制御を正しく行うには、すべてのものが以前と同じように動作し、かつ、機能の期待される動作の範囲内でテクニックを使用してユーザビリティを制限する必要があります。たとえば、特定の権限(GPS、インターネットアクセスなど)が付与されている場合、アプリ/ユーザーの観点からその機能を利用できるようにすることができます(GPSをオンにしたり、接続しようとしたりすることができます)が、変更後の実装では実際のデータを提供できません。インターネットアクセスは以前と同様に許可されますが、データカバレッジやルーティングがないため、接続に成功することはありません。このようなシナリオは、通常の使用でも予想されるため、すでにアプリによって処理されているはずです。このようなことは、通常の使用で起こりうることなので、このような状況でのクラッシュは、アプリケーションのバグに関連している可能性が高いはずです。
この問題が発生した環境についての情報が不足しており、推測で問題を診断することはできませんが、一種の解決策として、次のような方法を検討することができます。 setDefaultUncaughtExceptionHandler() このような予期せぬ例外をキャッチし、アプリがクラッシュする代わりに、ユーザーに必要なパーミッションの詳細情報を表示することができます。この機能は、CrittercismやACRAなどのツールと競合する可能性が高いので、これらのツールを使用する場合は注意してください。
注意事項
ご注意ください
android.permission.INTERNET
は、ネットワーキングを成功させるためにマニフェストで宣言する必要のある、ネットワーキングに関連する唯一のパーミッションではありません。以下のような
INTERNET
これは基本的にネットワークデータ転送を行うための基本的な要件です)。しかし、ネットワークスタック/ライブラリがネットワークに関する情報も取得したい場合は、以下の権限も必要です。
android.permission.ACCESS_NETWORK_STATE
をマニフェストに追加する必要があります。
HttpUrlConnection
クライアント(
チュートリアルを見る
).
追記(2015-07-16)
Android 6 (通称: Marshmallow) では、次のようなまったく新しい権限管理メカニズムが導入されました。 ランタイムパーミッション . また、アプリを削除することなく、既に付与された権限を取り消すこともできます。
<ブロッククオートこれは、新しいパーミッションモデルを導入し、ユーザーが アプリの権限を実行時に直接管理することができます。このモデルにより、ユーザーは を合理化する一方で、パーミッションの可視性と制御を向上させました。 アプリ開発者のためのインストールと自動更新のプロセス。ユーザー は、インストールされたアプリに対して個別にアクセス許可を与えたり、取り消したりすることができます。
ただし、この変更は
INTERNET
または
ACCESS_NETWORK_STATE
これは、通常のパーミッションとみなされます。ユーザーは、これらのパーミッションを明示的に許可する必要はありません。
参照
動作変更の説明
のページで詳細を確認し、あなたのアプリが新しいシステムでも正しく動作することを確認してください。特に重要なのは、プロジェクトで
targetSdk
を少なくとも
23
として
しなければならない
は新しいパーミッションモデルをサポートします (
詳細資料
). まだ準備が整っていない場合は
targetSdk
をせいぜい
22
これにより、新しいAndroidでも、アプリがインストールされたときに古い権限システムが使用されるようになります。
関連
-
[解決済み】メソッド 'findViewById(int)' を解決できない。)
-
[解決済み】react-native: コマンドが見つかりません。
-
[解決済み】起動アクティビティを特定できませんでした。デフォルトのアクティビティが見つかりませんでした
-
[解決済み] [Solved] java.lang.RuntimeException: アクティビティーのインスタンス化ができません ComponentInfo
-
[解決済み】Android Studio。Android.support.design.widget.FloatingActionButton クラスを膨らませるのにエラーが発生する。
-
[解決済み】Android Studioで最新バージョンのgradleを使用する方法
-
[解決済み】getCheckedRadioButtonId()が無駄なintを返す?
-
[解決済み] エラー - Android リソースのリンクに失敗しました (AAPT2 27.0.3 Daemon #0)
-
[解決済み] コンパイルした.apkを端末にインストールしようとするとINSTALL_FAILED_UPDATE_INCOMPATIBLEが表示される
-
[解決済み] Android Fragment onAttach() 非推奨
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Android ADB デバイスがオフラインで、コマンドを発行できない。
-
[解決済み】react-native: コマンドが見つかりません。
-
[解決済み】インストールエラー。インストールエラー:install_failed_older_sdk
-
[解決済み] [Solved] Unsupported method: ベースコンフィグ.getApplicationIdSuffix()
-
[解決済み】リストビューにonclicklistenerを追加する(android)
-
[解決済み] エラー - Android リソースのリンクに失敗しました (AAPT2 27.0.3 Daemon #0)
-
[解決済み] Android Studioで「URIが登録されていません」と報告されるのはなぜですか?[クローズド]
-
[解決済み] Looper.prepare()を呼び出していないスレッドではハンドラを作成できない
-
[解決済み] SDKの場所がandroid studioで見つからない
-
[解決済み] Android SDK の場所には空白を含めないでください。NDK ツールで問題が発生するためです。