마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

HttpUrlConnection 안드로이드 Target 버전 질문드립니다...

0 추천

PHP에 JSON을 데이터를 읽어와 파싱하여 날씨와 관련된 앱을 개발하려고 합니다.

처음 개발을 할때 API 27 OREO 에서 개발을 하였는데

OREO에서는 HttpUrlConnection으로 읽어와 파싱하는데 문제가 없었는데

현재 핸드폰(S10 5G)또는 API 29 Q 또는  API 28 PIE 에서 HttpUrlConnection이 호출되면

connec() 구문에서 계속 예외가 처리됩니다.

버전이 달라진 후 로드자체가 안되어 혹시 28이상에 인터넷 연결관련 설정할 것이 더있는지

아니면 다른 문제점 지적 또는 알려주시면 감사하겠습니다...ㅠㅠ

HttpUrlConnection은 Fragment 에서 AsyncTask Background로 구동하였습니다.

코드와 에러도 첨부하겠습니다

아래는 에러문 입니다.

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.a414lab.testnavigation, PID: 14995
    java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
        at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:121)
        at org.json.JSONTokener.nextValue(JSONTokener.java:98)
        at org.json.JSONObject.<init>(JSONObject.java:164)
        at org.json.JSONObject.<init>(JSONObject.java:181)
        at com.example.a414lab.testnavigation.HomeFragment.showIndoorResult(HomeFragment.java:202)
        at com.example.a414lab.testnavigation.HomeFragment.access$500(HomeFragment.java:33)
        at com.example.a414lab.testnavigation.HomeFragment$GetData2.onPostExecute(HomeFragment.java:367)
        at com.example.a414lab.testnavigation.HomeFragment$GetData2.onPostExecute(HomeFragment.java:348)
        at android.os.AsyncTask.finish(AsyncTask.java:755)
        at android.os.AsyncTask.access$900(AsyncTask.java:192)
        at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:772)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
private class GetData extends AsyncTask<String, Void, String> {
        
        ProgressDialog progressDialog;
        String errorString = null;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progressDialog = ProgressDialog.show(getActivity(),
                    "데이터 로딩중입니다", null, true, true);
        }

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

            progressDialog.dismiss();
            Log.d(TAG, "response - " + result);
            mJsonString = result;
            showOutdoorResult();
        }

        @Override
        protected String doInBackground(String... params) {

            String serverURL = params[0];
            String postParameters = params[1];

            try {

                URL url = new URL(serverURL);
                HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();

                httpURLConnection.setReadTimeout(5000);
                httpURLConnection.setConnectTimeout(5000);
                httpURLConnection.setRequestMethod("POST");
                httpURLConnection.setDoInput(true);
                //↓↓↓↓↓↓↓↓↓ API 28 이상, S10 5G 에서 실행시
                httpURLConnection.connect();
                //↑↑↑↑↑↑↑↑↑ 이부분에서 에러가 발생합니다
                //API 27 OREO 에서는 이상없이 구동이 되었습니다.
                OutputStream outputStream = httpURLConnection.getOutputStream();
                outputStream.write(postParameters.getBytes("UTF-8"));
                outputStream.flush();
                outputStream.close();

                int responseStatusCode = httpURLConnection.getResponseCode();
                Log.d(TAG, "response code - " + responseStatusCode);

                InputStream inputStream;
                if(responseStatusCode == HttpURLConnection.HTTP_OK) {
                    inputStream = httpURLConnection.getInputStream();
                }
                else{
                    inputStream = httpURLConnection.getErrorStream();
                }

                InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

                StringBuilder sb = new StringBuilder();
                String line;

                while((line = bufferedReader.readLine()) != null){
                    sb.append(line);
                }
                bufferedReader.close();
                return sb.toString().trim();
            } catch (Exception e) {
                Log.d(TAG, "GetData : Error ", e);
                errorString = e.toString();
                return null;
            }
        }
    }

 

빵아찌 (140 포인트) 님이 2019년 9월 1일 질문
빵아찌님이 2019년 9월 1일 수정

1개의 답변

0 추천

pie버젼이라면 보안 강화 때문에 발생하는 문제로 생각되네요.

아래 글을 참조 해 보세요.

https://developside.tistory.com/85

익명사용자 님이 2019년 9월 2일 답변
감사합니다! 먼저 해결했는데 보안 강화때문이였던게 맞네요... http가 27까지는 되었지만 28이상부터는 https를 사용해야 된다는것을 이제 알았습니다...ㅠㅠ
갈길이 머네요 답변해주셔서 너무너무 감사합니다!
...