728x90

Maria DB ↔ PHP ↔ Android 연동하기 - 3. 외부 접속 설정하기 를 안 보셨다면 먼저 보시는 것을 추천드립니다.

 

Maria DB ↔ PHP ↔ Android 연동하기 - 3. 외부 접속 설정하기

Maria DB ↔ PHP ↔ Android 연동하기 - 2. JSON 형식으로 추출하기를 안보셨다면 먼저 보시는 것을 추천드립니다. Maria DB ↔ PHP ↔ Android 연동하기 - 2. JSON 형식으로 추출하기 Maria DB &..

1d1cblog.tistory.com

전 포스팅에서 로컬에 있는 php 파일을 외부에서 접근할 수 있게 해 주었습니다. 이제 이 php 파일에 있는 JSON을 파싱 해서 사용하겠습니다.

 

먼저 인터넷을 사용해야 하기 때문에 Manifest.xml에 인터넷 사용허가 코드를 넣어줘야 합니다.

추가로 안드로이드 Pi 버전이상을 사용 중이라면 application 태그 안에 androidandroid:usesCleartextTraffic="true"도 추가해줘야 합니다.

 

추가하지 않으면 ava.io.IOException: Cleartext HTTP traffic to not permitted 에러가 발생하게 됩니다.

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

파싱 한 값을 저장할 클래스를 하나 만들어줍니다. 

public class Tree {
    String name;            // 이름
    String category;        // 카테고리
    String keyword;         // 키워드
    ...

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }

    public String getKeyword() {
        return keyword;
    }

    public void setKeyword(String keyword) {
        this.keyword = keyword;
    }
    ...
}

get과 set은 일일이 입력하는 것보다 변수를 입력하고 드래그 후 Alt + Insert를 눌러 Getter and Setter를 눌러주고 추가를 해줍니다.

activity_main.xml에는 간단하게 TextView만 넣어주었습니다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginStart="173dp"
        android:layout_marginLeft="173dp"
        android:layout_marginTop="347dp"
        android:text="Hello World!" />

</RelativeLayout>

MainActivity.java에는 AsyncTask를 사용합니다.

package com.example.treemanagement;

import android.content.pm.ActivityInfo;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    private TextView textView;
    private String jsonString;
    ArrayList<Tree> treeArrayList;      // 나무정보들을 저장할 ArrayList
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = (TextView) findViewById(R.id.textView);

        JsonParse jsonParse = new JsonParse();      // AsyncTask 생성
        jsonParse.execute("http://아이피주소:포트번호/php명.php");     // AsyncTask 실행
    }

    public class JsonParse extends AsyncTask<String, Void, String> {
        String TAG = "JsonParseTest";
        @Override
        protected String doInBackground(String... strings) {    // execute의 매개변수를 받아와서 사용 
            String url = strings[0];
            try {
                URL serverURL = new URL(url);
                HttpURLConnection httpURLConnection = (HttpURLConnection) serverURL.openConnection();

                httpURLConnection.setReadTimeout(5000);
                httpURLConnection.setConnectTimeout(5000);
                httpURLConnection.connect();

                int responseStatusCode = httpURLConnection.getResponseCode();

                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();
                Log.d(TAG, sb.toString().trim());

                return sb.toString().trim();        // 받아온 JSON의 공백을 제거
            } catch (Exception e) {
                Log.d(TAG, "InsertData: Error ", e);
                String errorString = e.toString();
                return null;
            }
        }

        @Override
        protected void onPostExecute(String fromdoInBackgroundString) { // doInBackgroundString에서 return한 값을 받음
            super.onPostExecute(fromdoInBackgroundString);  

            if(fromdoInBackgroundString == null)
                textView.setText("error");
            else {
                jsonString = fromdoInBackgroundString;
                treeArrayList = doParse();
                Log.d(TAG,treeArrayList.get(0).getName());
                textView.setText(treeArrayList.get(0).getName());
            }
        }
        
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }
        
        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
        }

        
        private ArrayList<Tree> doParse() {
            ArrayList<Tree> tmpTreeArray = new ArrayList<Tree>();
            try {
                JSONObject jsonObject = new JSONObject(jsonString);
                JSONArray jsonArray = jsonObject.getJSONArray("Tree");

                for(int i=0;i<jsonArray.length();i++) {
                    Tree tmpTree = new Tree();
                    JSONObject item = jsonArray.getJSONObject(i);
                    tmpTree.setName(item.getString("이름"));
                    tmpTree.setCategory(item.getString("카테고리"));
                    tmpTree.setKeyword(item.getString("키워드"));
                    tmpTree.setNumber(item.getInt("보유수량"));
                    tmpTree.setPrice(item.getInt("주당가격"));
                    tmpTree.setLocation(item.getString("위치"));
                    tmpTree.setEct(item.getString("특이사항"));
                    tmpTree.setTreeHeight(item.getString("수고"));
                    tmpTree.setRootCollar(item.getString("근원직경"));
                    tmpTree.setBreastHeight(item.getString("흉고직경"));
                    tmpTree.setWidthCrown(item.getString("수관폭"));
                    tmpTree.setLength(item.getString("수관길이"));
                    tmpTree.setCrownHeight(item.getString("지하고"));
                    tmpTree.setManner(item.getString("육종방법"));
                    tmpTree.setDateTime(item.getString("입력시간"));

                    tmpTreeArray.add(tmpTree);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return tmpTreeArray;
        } // JSON을 가공하여 ArrayList에 넣음
    }
}

로그를 확인해보면 제대로 받아와 지는 것을 확인할 수 있습니다.

728x90

+ Recent posts