HttpURLConnection .getInputStream () падает на Зефир не Oreo - PullRequest
0 голосов
/ 24 июня 2018

Следующий код работает на Android 8. На планшете под управлением 6 он вылетает при получении getinputstream с ошибкой файла io.Я пытался на ЧАСЫ и ЧАСЫ без удачи.Пожалуйста помоги.Ничего не работаетДаже попытка залпа не помогает.My Web API отлично работает на компьютере и телефоне.

@Override
protected String doInBackground(String... args) {
    StringBuilder result = new StringBuilder();

    try {
        URL url = new URL("https://api.github.com/users/dmnugent80/repos");
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
        InputStream in = new BufferedInputStream(urlConnection.getInputStream());
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        String line;

        while ((line = reader.readLine()) != null) {
            result.append(line);
        }
    }
    catch(Exception e) {
        e.printStackTrace();
    }


    return result.toString();
}

LOG CAT HERE


06-24 02: 01: 21.813 22840-22890/com.marcusengineering.recipedatabase I / System.out: [CDS] [DNS] getAllByNameImpl netId = 0 06-24 02: 01: 21.813 22840-22890 / com.marcusengineering.recipedatabase D / libc-netbsd: [getaddrinfo]: имя хоста= recipedatabase.gear.host;servname = (нуль);NetID = 0;mark = 0 [getaddrinfo]: ai_addrlen = 0;ai_canonname = (нуль);ai_flags = 4;ai_family = 0 06-24 02: 01: 21.817 22840-22890 / com.marcusengineering.recipedatabase D / libc-netbsd: [getaddrinfo]: имя_хоста = receedatabase.gear.host;servname = (нуль);NetID = 0;mark = 0 06-24 02: 01: 21.818 22840-22890 / com.marcusengineering.recipedatabase D / libc-netbsd: [getaddrinfo]: ai_addrlen = 0;ai_canonname = (нуль);ai_flags = 1024;ai_family = 0 06-24 02: 01: 21.824 22840-22890 / com.marcusengineering.recipedatabase D / libc-netbsd: getaddrinfo: receedatabase.gear.host получить результат из прокси gai_error = 0 06-24 02: 01: 21.824 22840-22890 / com.marcusengineering.recipedatabase I / System.out: [CDS] Тайм-аут rx: 0 06-24 02: 01: 21.826 22840-22890 / com.marcusengineering.recipedatabase I / System.out: [сокет] [0] соединениеreceedatabase.gear.host/204.246.56.80:80;LocalPort=43028(0) [CDS] connect [receedatabase.gear.host/204.246.56.80:80] 06-24 02: 01: 21.826 22840-22890 / com.marcusengineering.recipedatabase D / Posix: [Отладка Posix_connect] Процесс com.marcusengineering.recipedatabase: 80 06-24 02: 01: 21.919 22840-22890 / com.marcusengineering.recipedatabase I / System.out: порт [CDS] [43028] [сокет] [/ 192.168.1.163:43028] подключено 06-24 02: 01: 21.920 22840-22890 / com.marcusengineering.recipedatabase I / System.out: [CDS] время ожидания приема: 0 [CDS] SO_SND_TIMEOUT: 0 06-24 02: 01: 21.921 22840-22890 / com.marcusengineering.recipedatabase I / System.out: [OkHttp] sendRequest >> [OkHttp] sendRequest << 06-24 02: 01: 21.982 22840-22890 / com.marcusengineering.recipedatabase W / System.err: java.io.FileNotFoundException: <a href="http://recipedatabase.gear.host/RestServiceImpl.svc/jsonfindtable/SELECT" rel="nofollow noreferrer">http://recipedatabase.gear.host/RestServiceImpl.svc/jsonfindtable/SELECT UnitID, UnitName, HiddenFlag FROMTblUnits ORDER BY UnitName для JSON PATH на com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream (HttpURLConnectionImpl.java:238) на com.marcusengineering.recipedatabase.MainActivity.getRestFromreceedatabase.MainActivity $ MyAsyncInitialLoad.doInBackground (MainActivity.java:252) в com.marcusengineering.recipedatabase.MainActivity $ MyAsyncInitialLoad.doInBackground (MainActivity.java:232) в android.os.AsyncTask 06/2.-24 02: 01: 21.983 22840-22890 / com.marcusengineering.recipedatabase W / System.err: на java.util.concurrent.FutureTask.run (FutureTask.java:237) на android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:234) в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1113) в Java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:588) в java.lang.Thread.run (Thread.java:818)

Ответы [ 2 ]

0 голосов
/ 24 июня 2018

FINNNNNNALY выяснил это !.

Не уверен, какие из них были на 100% нужны, но вот что я сделал, чтобы помочь другим бедным душам.

  1. Убедитесь, что ваш веб-интерфейс создан без дополнительной обертки, добавленной из WCF, т.е. в виде простого текста. (не критично)
  2. Избавьтесь от пробелов в вашем URL. Похоже, OREO сделает это за вас. Более ранние версии не должны. Код для этого: URL-адрес URL = новый URL-адрес (query.replace ("", "% 20"));
  3. Счастливый танец

В целом вызов должен быть следующим:

            URL url = new URL(query.replace(" ","%20"));
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();


        int i = urlConnection.getResponseCode();
        InputStream inputs;
        if (i < HttpURLConnection.HTTP_BAD_REQUEST) {
            inputs = urlConnection.getInputStream();
        } else {
            // Error
            inputs = urlConnection.getErrorStream();
            return "-1";
        }

        InputStream in = new BufferedInputStream(urlConnection.getInputStream());
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        String line = "";

        while ((line = reader.readLine()) != null) {
            result.append(line);
        }

Чтобы установить форматирование для необработанной строки в WCF, см. Следующее.

В *****. Cs

[OperationContract]
    [WebGet( UriTemplate = "jsonFindTableBare/{id}")] 
    Stream DoWork(string id);

В svc.cs

public Stream DoWork(String id)
    {

        WebOperationContext.Current.OutgoingResponse.ContentType = "application/json; charset=utf-8";
        String str = "YOUR RESPONSE HERE";
        WebOperationContext.Current.OutgoingResponse.ContentType = "text/plain";
        return new MemoryStream(Encoding.UTF8.GetBytes(str));
    }

Спасибо за помощь, Мангал. Цени это.

0 голосов
/ 24 июня 2018

Вы должны сначала проверить код ответа, чтобы также обработать поток ввода ошибок.

InputStream inputs;
if (urlConnection.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
            inputs = urlConnection.getInputStream();
        } else {
            // Error
            inputs = urlConnection.getErrorStream();
        }

, а затем позвонить

   InputStream in = new BufferedInputStream(urlConnection);

Я также столкнулся с некоторым падением приложения из-за обработки потока ошибокdireclty.
Пожалуйста, всегда проверяйте, это хорошая практика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...