Ошибка запроса HttpUrlConnection (отсутствует разрешение на доступ в Интернет, когда разрешение включено)

У меня есть следующая ошибка для нескольких моих пользователей:

Caused by: java.lang.SecurityException: Permission denied (missing INTERNET permission?)
    at java.net.InetAddress.lookupHostByName(InetAddress.java:418)
    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
    at java.net.InetAddress.getAllByName(InetAddress.java:214)
    at com.android.okhttp.internal.Dns$1.getAllByName(Dns.java:28)
    at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:216)
    at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:122)
    at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:292)
    at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255)
    at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206)
    at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345)
    at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:89)
    at com.android.okhttp.internal.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:197)
    at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:254)
    at [my communication HttpUrlConnection request]
    ... 12 more
Caused by: libcore.io.GaiException: getaddrinfo failed: EAI_NODATA (No address associated with hostname)
    at libcore.io.Posix.getaddrinfo(Native Method)
    at libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.java:61)
    at java.net.InetAddress.lookupHostByName(InetAddress.java:405)
    ... 25 more
Caused by: libcore.io.ErrnoException: getaddrinfo failed: EACCES (Permission denied)
    ... 28 more

Приложению требуется Интернет для выполнения его основных функций, я не думаю, что пользователь удалил разрешение, используя root или что-то в этом роде.

Кроме того, эта ошибка была отправлена ​​мне с помощью моего собственного инструмента для создания отчетов об ошибках. Я сделал загрузку с зарегистрированной ошибкой, и в этот момент разрешение было доступно.

Нет ограничений на модель устройства версии Android, в которой есть ошибка.

Пример части манифеста:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">

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

[...]

Любая подсказка ценится,

Заранее спасибо.


person Gabriel Falcone    schedule 08.12.2015    source источник


Ответы (2)


Это поможет вам. Напишите следующее в своем методе onCreate

int PERMISSION_ALL = 1;
    String[] PERMISSIONS = {Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_SMS, Manifest.permission.CAMERA};

    if (!hasPermissions(this, PERMISSIONS)) {
        ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL);
    }

И получить этот метод

 public static boolean hasPermissions(Context context, String... permissions)
{
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null)
    {
        for (String permission : permissions)
        {
            if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED)
            {
                return false;
            }
        }
    }
    return true;
}

Приложение будет запрашивать только те разрешения, которые ему нужны, и то только один раз. Если это сработает, проголосуйте и дайте мне знать. Это сработало для меня

person Vaibhav Joshi    schedule 20.01.2017

Для запроса HttpUrlConnection также требуется android.permission.ACCESS_NETWORK_STATE. У вас также есть это разрешение, указанное в манифесте?

Опубликуйте свой файл манифеста, чтобы мы могли видеть, что android.permission.ACCESS_NETWORK_STATE и android.permission.INTERNET перечислены без каких-либо орфографических, заглавных и синтаксических ошибок.

Проблема также может возникнуть, если пользователь рутировал свое устройство Android и возился с разрешениями. Как узнать, что пользователь не рутировал устройство? Можете ли вы воспроизвести проблему на любом из ваших собственных устройств?

Подробнее об этой проблеме см. здесь: SecurityException: разрешение отклонено (отсутствует разрешение INTERNET?)

person joshgoldeneagle    schedule 08.12.2015
comment
Я не могу загрузить его сюда, но я на 100% уверен, что с манифестом проблем нет. Я проверяю разрешения вручную, прежде чем даже разрешить это, и разрешение было подтверждено. Код даже не должен достигать этой точки, если разрешения недоступны. Поскольку ошибка была загружена, в какой-то момент разрешение было доступно. Я прочитал эту ссылку, и у меня есть свои механизмы отлова ошибок, чтобы избежать сбоев, но я действительно хотел понять, что происходит и как вообще правильно обрабатывать, а не просто делать попытку-отлов. - person Gabriel Falcone; 08.12.2015
comment
Потому что это не происходит только в одном приложении. У меня есть библиотека, которая используется в нескольких приложениях, и это происходит не только в одном. Хотя и не часто, в нем все же есть повторяющиеся записи. Я не думаю, что было бы полезно загружать манифесты всех приложений, которые обычно работают нормально, но несколько запросов все еще терпят неудачу. Но, как вы и просили, я вставил начало манифеста одного из приложений. Спасибо за внимание. - person Gabriel Falcone; 08.12.2015