HttpURLConnection возвращает ошибки при вызове connect()

Я новичок в Android и пытаюсь передать String json в API через httpURLConnection, но он всегда возвращает ошибку. Это копия кода, который я нашел в Интернете, и он должен работать. Я попытался создать другой класс, который расширяет AsyncTask, но я не знаю, как вернуть результаты из API. Может кто-нибудь, пожалуйста, скажите мне, что я сделал неправильно, и помогите мне исправить это.

String json = "{\"requests\":[{\"image\":{\"content\":\"" + encodedString +  "\"},\"features\":[{\"type\":\"LABEL_DETECTION\",\"maxResults\":\"10\"}]}]}";

            try{

                URL urlObj = new URL(urlVisit);
                HttpURLConnection conn = (HttpURLConnection) urlObj.openConnection();
                conn.setDoOutput(true);
                conn.setRequestMethod("POST");
                conn.setRequestProperty("Accept-Charset", "UTF-8");
                conn.setReadTimeout(10000);
                conn.setConnectTimeout(15000);
                conn.connect();
                DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
                wr.writeBytes(json);
                wr.flush();
                wr.close();

                InputStream in = new BufferedInputStream(conn.getInputStream());
                BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                StringBuilder result = new StringBuilder();
                String line;
                while ((line = reader.readLine()) != null) {
                    result.append(line);
                }

                Log.d("test", "result from server: " + result.toString());

            } catch (IOException e) {
                e.printStackTrace();
            }

ошибки, выдаваемые консолью:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: edmt.dev.androidcamera2api, PID: 22584
android.os.NetworkOnMainThreadException
    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1460)
    at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:102)
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:90)
    at java.net.InetAddress.getAllByName(InetAddress.java:787)
    at com.android.okhttp.Dns$1.lookup(Dns.java:39)
    at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:175)
    at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:141)
    at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:83)
    at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:174)
    at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:126)
    at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:95)
    at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:281)
    at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:224)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:461)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:127)
    at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.connect(DelegatingHttpsURLConnection.java:89)
    at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.connect(Unknown Source:0)
    at edmt.dev.androidcamera2api.MainActivity$2.onClick(MainActivity.java:177)
    at android.view.View.performClick(View.java:6291)
    at android.view.View$PerformClick.run(View.java:24931)
    at android.os.Handler.handleCallback(Handler.java:808)
    at android.os.Handler.dispatchMessage(Handler.java:101)
    at android.os.Looper.loop(Looper.java:166)
    at android.app.ActivityThread.main(ActivityThread.java:7523)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)
1
0
645
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Судя по трассировке стека, вы пытаетесь выполнить сетевой вызов из MainThread.

E/AndroidRuntime: FATAL EXCEPTION: main
Process: edmt.dev.androidcamera2api, PID: 22584
android.os.NetworkOnMainThreadException

Вы должны обернуть свой сетевой вызов внутри AsyncTask или любого другого фонового потока, который не блокирует пользовательский интерфейс.

Вот фрагмент кода для начала:

class TestAsync extends AsyncTask<String, Integer, String>
    {

        protected void onPreExecute (){
            super.onPreExecute();
        }

        protected String doInBackground(String... params) {
            // wrap the network call here
            String json = "{\"requests\":[{\"image\":{\"content\":\"" + encodedString +  "\"},\"features\":[{\"type\":\"LABEL_DETECTION\",\"maxResults\":\"10\"}]}]}";

            StringBuilder result = new StringBuilder();

            try{

                URL urlObj = new URL(params[0]);
                HttpURLConnection conn = (HttpURLConnection) urlObj.openConnection();
                conn.setDoOutput(true);
                conn.setRequestMethod("POST");
                conn.setRequestProperty("Accept-Charset", "UTF-8");
                conn.setReadTimeout(10000);
                conn.setConnectTimeout(15000);
                conn.connect();
                DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
                wr.writeBytes(json);
                wr.flush();
                wr.close();

                InputStream in = new BufferedInputStream(conn.getInputStream());
                BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                String line;
                while ((line = reader.readLine()) != null) {
                    result.append(line);
                }

            } catch (IOException e) {
                e.printStackTrace();
            }

            return result.toString();
        }

        protected void onProgressUpdate(Integer...a){
            super.onProgressUpdate(a);
        }

        protected void onPostExecute(String result) {
            super.onPostExecute(result);

            Log.d("test", "result from server: " + result);
        }
    }

Чтобы вызвать AsyncTask:

 new TestAsync().execute(urlVisit);

Мне, действительно, жаль. Я пытался заставить его работать, но это не так. Я на хакатоне, и мы работали над этим последние 12 часов. Не могли бы вы указать или заполнить методы для меня/нас?

Hassan G 27.01.2019 06:38

Я понимаю, что мне нужно создать поток AsyncTask, который не блокирует пользовательский интерфейс основного потока. Однако мне нужно получить данные, которые я получаю от своих сетевых вызовов, и я не знаю, как реализовать это в AsyncTask.

Hassan G 27.01.2019 06:51

@HassanG проверьте обновленный ответ.

Prokash Sarkar 27.01.2019 08:19

Вы добавили разрешение на доступ в Интернет на AndroidManifest.xml?

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

Да, я сделал. Проблема с асинхронным вызовом

Hassan G 27.01.2019 06:11

Другие вопросы по теме