эта ошибка действительно очень странная, и я не знаю, как ее воспроизвести и как исправить, потому что я много искал, но ничего не помогло.
Вот трассировка стека:
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). Я не знаю, рутировано ли устройство или что (пока я не вижу эту информацию)
Ответы:
ПРИМЕЧАНИЕ. Я написал этот ответ в июне 2013 года, поэтому сейчас он немного устарел. Начиная с версии 6 (Marshmallow) в платформе Android многое изменилось, что в настоящее время делает проблему более / менее устаревшей. Однако я считаю, что этот пост все же стоит прочитать как пример общего подхода к анализу проблемы.
Возникающее исключение (
SecurityException: Permission denied (missing INTERNET permission?)
) четко указывает на то, что вам не разрешено работать в сети. Это довольно неоспоримый факт. Но как это могло случиться? Обычно это происходит из-за отсутствия<uses-permission android:name="android.permission.INTERNET" />
записи в вашемAndroidManifest.xml
файле, либо, поскольку разрешение на доступ в Интернет предоставляется при установке, а не во время выполнения, из-за давней пропущенной ошибки в платформе Android, которая приводит к успешной установке вашего приложения, но без ожидаемого предоставления разрешения.Мой манифест правильный, как это может произойти?
Теоретически наличие
uses-permission
в Manifest полностью удовлетворяет требованиям, и с точки зрения разработчика это все, что нужно сделать для работы в сети. Более того, поскольку разрешения отображаются пользователю во время установки, тот факт, что ваше приложение было установлено на устройстве пользователя, означает, что он / она предоставил то, что вы просили (в противном случае установка отменяется), поэтому предположим, что если ваш код выполняется, то все запрошенные разрешения предоставлено действительно. И после предоставления пользователь не может отозвать разрешение, кроме как полностью удалить приложение, поскольку стандартная платформа Android (от AOSP) в настоящее время не предлагает такой функции.Но все становится сложнее, если вы также не возражаете, чтобы ваше приложение работало и на устройствах с root- доступом. В Google Play доступны инструменты, которые пользователи могут установить для управления разрешениями, предоставляемыми установленным приложениям во время выполнения, например: Permissions Denied и другие. Это также можно сделать с помощью CyanogenMod , торговой марки поставщика (например, LG) или другого специального ПЗУ , содержащего различные типы «менеджеров конфиденциальности» или аналогичные инструменты.
Итак, если приложение заблокировано в любом случае, оно в основном намеренно заблокировано пользователем, и если это так, в этом случае это действительно большая проблема пользователя (или он / она не понимает, что действительно делают определенные параметры / инструменты и каковы будут последствия) чем ваш, потому что стандартный SDK (и большинство приложений написано с учетом этого SDK) просто не ведет себя таким образом. Поэтому я сильно сомневаюсь, что эта проблема возникает на «стандартном» устройстве без рутирования со стандартным ПЗУ (или таких производителей, как Samsung, HTC, Sony и т. Д.).
Я не хочу рушиться ...
Правильно реализованное управление разрешениями и / или блокировка организации должны учитывать тот факт, что большинство приложений могут быть не готовы к ситуации, когда доступ к определенным функциям предоставляется и недоступен одновременно, поскольку это своего рода противоречие, когда приложение использует манифест для запросить доступ во время установки. Правильно выполненный контроль доступа должен заставить все работать, как раньше, и по-прежнему ограничивать удобство использования с помощью методов в рамках ожидаемого поведения функции. Например, когда предоставляется определенное разрешение (например, GPS, доступ в Интернет), такая функция может быть сделана доступной с точки зрения приложения / пользователя (то есть вы можете включить GPS или попытаться подключиться), измененная реализация не может предоставить реальных данных - т.е. GPS всегда может не возвращать координаты, например, когда вы находитесь в помещении или у вас нет спутникового "исправления". Доступ в Интернет можно предоставить, как и раньше, но вы не можете установить успешное соединение, поскольку нет покрытия данных или маршрутизации. Таких сценариев следует ожидать и при обычном использовании, поэтому они уже должны обрабатываться приложениями. Поскольку это может происходить при обычном повседневном использовании, любой сбой в такой ситуации, скорее всего, должен быть связан с ошибками приложения.
Нам не хватает информации о среде, в которой возникает эта проблема, чтобы диагностировать проблему без предположений, но в качестве решения вы можете рассмотреть возможность использования setDefaultUncaughtExceptionHandler () для обнаружения таких неожиданных исключений в будущем и, например, просто показать пользователю подробную информацию о том, какое разрешение ваше приложение требует, а не просто падает. Обратите внимание, что его использование, скорее всего, будет конфликтовать с такими инструментами, как Crittercism, ACRA и другими, поэтому будьте осторожны, если вы используете любой из них.
Примечания
Помните, что
android.permission.INTERNET
это не единственное разрешение, связанное с сетью, которое вам может потребоваться объявить в манифесте, чтобы попытаться успешно установить сеть. ПолучениеINTERNET
разрешения просто позволяет приложениям открывать сетевые сокеты (что является фундаментальным требованием для любой передачи данных по сети). Но если ваш сетевой стек / библиотека также хотели бы получить информацию о сетях, вам также понадобитсяandroid.permission.ACCESS_NETWORK_STATE
ваш манифест (который, например, требуется клиенту HttpUrlConnection ( см . Руководство ).Приложение (16.07.2015)
Обратите внимание, что Android 6 (он же Marshmallow) представил совершенно новый механизм управления разрешениями, называемый разрешениями времени выполнения . Это дает пользователю больше контроля над предоставленными разрешениями (также позволяет выборочное предоставление) или позволяет отозвать уже предоставленные разрешения без необходимости удаления приложения:
Однако эти изменения не влияют
INTERNET
илиACCESS_NETWORK_STATE
разрешений, которые считаются «Normal» разрешением. Пользователю не нужно явно предоставлять эти разрешения.См. Подробности на странице описания изменений поведения и убедитесь, что ваше приложение будет корректно работать и в новых системах. Это особенно важно, если в вашем проекте задано
targetSdk
как минимум такое же значение,23
как и тогда, когда вы должны поддерживать новую модель разрешений ( подробная документация ). Если вы не готовы, убедитесь, что вы придерживаетесь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"/>
Это исправило для меня.
источник
Я решил эту ошибку, по ошибке добавлял разрешения внутри тега приложения. Поставил снаружи и работает нормально. Надеюсь, это кому-то поможет.
источник
У меня тоже была такая проблема. было странно, что он работал на моем эмуляторе леденца на палочке, но не на моем реальном устройстве 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
Похоже, в Android была ошибка, исправленная в версии 4.3 (?).
источник
Как и сказал Том. Когда вы начинаете с заглавной буквы,
A
автозаполнение завершит его как.ANDROID.PERMISSION.INTERNET
Когда вы начнете печатать с помощью,
a
автозаполнение завершит его какandroid.permission.INTERNET
Второй правильный.
источник
Я часами ищу решение этой проблемы, и ни одно из решений в ответах не помогло. Затем я обнаружил, что случайно добавил пробел во время автозаполнения между
android.permission.INTERNET
и"
источник
Что ж, это очень сбивающая с толку ошибка. Причин могло быть много:
источник
удалите это в своем файле манифеста
xmlns:tools="http://schemas.android.com/tools"
источник