[Android APP] feat. Kotlin/Java 공부

1. 데이터 셋 불러오기

JuJu(INTJ) 2021. 12. 15. 02:22

공공 데이터 사이트

https://www.data.go.kr/tcs/dss/selectApiDataDetailView.do?publicDataPk=15084084
/**
 * 도시(adminArea)이름과 시(Locality)이름을 기준으로 x, y 좌표를 반환한다.
 * @param adminArea 도시 이름(예: 충청남도)
 * @param locality 시 이름(예: 아산시, 종로구)
 * @return [x, y] 정수 배열, 찾는 도시 이름과 시 이름이 잘못된 경우 null
 */
private int[] getPosition(String adminArea, String locality) {
    final String filename = "final_exam_data.csv";
    File file = new File(this.getFilesDir(), filename);
    try {
        CSVReader csvReader = new CSVReader(new FileReader(file));
        csvReader.readNext();// skip column header
        String[] line = csvReader.readNext();
        while (line != null) {
            final String s1 = line[2];
            final String s2 = line[3];

            if (adminArea.equals(s1) && locality.equals(s2)) {
                Log.d(TAG, "x:" + line[5] + "y:" + line[6]);
                return new int[]{Integer.parseInt(line[5]), Integer.parseInt(line[6])};
            }

            line = csvReader.readNext();
        }

    } catch (IOException e) {
        e.printStackTrace();
        Log.e(TAG, e.getMessage());
    }
    return null;
}

위 함수는 기말고사 문제 풀이에 필요하지만, 강의에서 알리지 않아 공지로 올립니다.

위 함수를 사용하기 위해 build.gradle(Module)에 다음의 의존성을 추가합니다.

implementation 'com.opencsv:opencsv:4.4'

그리고 다음과 같은 csv 파일을 다음의 경로에 들어가야 합니다. com.example.final_exam_example 에는 자신의 패키지 명을 넣으면 됩니다.

/data/data/com.example.final_exam_example/files

파일은 DeviceFileExplorer를 사용하여 업로드하면 됩니다. DeviceFileExplorer는 일반적으로 Android Studio 오른쪽 아래에 있습니다.

============================================================================

 

1. 위치 권한 설정

 

Manifast 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.final_exam1">


    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
    <!--<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Final_exam1">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

 

MainActivity

 

package com.example.final_exam1;

import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContract;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.tasks.OnSuccessListener;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.List;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

public class MainActivity extends AppCompatActivity {

    public static final String TAG = "my application";
    //2. GPS 권한 요청
    private ActivityResultLauncher<String> requestPermissionLauncher =
            registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {
                if (isGranted) {
                    // Permission is granted. Continue the action or workflow in your
                    // app.
                    Log.d(TAG, "Permission granted");
                } else {
                    Log.e(TAG, "Permission grant failed");
                }
            });

    //1
    private FusedLocationProviderClient fusedLocationProviderClient;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //2
        requestPermissionLauncher.launch(Manifest.permission.ACCESS_COARSE_LOCATION);
        //1. 마지막으로 불려진 위치 불러오기
        fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED
                && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        fusedLocationProviderClient.getLastLocation().addOnSuccessListener(new OnSuccessListener<Location>() {
            @Override
            public void onSuccess(Location location) {
                //위도, 경도
                double latitude = location.getLatitude();
                double longitude = location.getLongitude();

                Geocoder geocoder = new Geocoder(getApplicationContext());
                try {
                   List<Address> locInfo = geocoder.getFromLocation(latitude,longitude,2);
                   String adminArea = locInfo.get(0).getAdminArea();

                   //지역 이름 출력
                   Log.d(TAG, adminArea);

                   if(adminArea.equals("충청남도")){
                       adminArea = "충남";
                   }

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

               new HTTPComm().execute();

            }
        });

    }

    private static class HTTPComm extends AsyncTask<Void, Void, Void> {
        @Override
        protected Void doInBackground(Void... voids) {
            try {

                URL url = getUrl();

                StringBuilder sb = getHTTPResult(url);

                Document document =
                        DocumentBuilderFactory.newInstance()
                                .newDocumentBuilder()
                                .parse(new ByteArrayInputStream(sb.toString().getBytes()));

                Element rootNode = document.getDocumentElement();
                Node itemNode = rootNode.getLastChild().getFirstChild();

            }catch (IOException | ParserConfigurationException | SAXException e){
                e.printStackTrace();
            }
            return null;
        }


        private StringBuilder getHTTPResult(URL url) throws IOException, SAXException, ParserConfigurationException {
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setRequestProperty("Content-type", "application/json");
            System.out.println("Response code: " + conn.getResponseCode());

            BufferedReader rd;
            if(conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
                rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            } else {
                rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
            }

            StringBuilder sb = new StringBuilder();
            String line;
            while ((line = rd.readLine()) != null) {
                sb.append(line);
            }
            rd.close();
            conn.disconnect();


        }

        private URL getUrl() throws UnsupportedEncodingException, MalformedURLException {
            //공공데이터 사이트 밑에 Java파일이 있음. 거기 눌러서 코드 복사사
            StringBuilder urlBuilder = new StringBuilder("http://openapi.data.go.kr/openapi/service/rest/Covid19/getCovid19SidoInfStateJson"); /*URL*/
            //서비스 키 입력 : 공공데이터 사이트에서 들어가면 디코딩!된 서비스키 넣어줘야함.
            String serviceKey = "9zmDQ4S3j8Qi7wsOXFeMe80pj/jHGSFp7iHloQlOvSTS67K1/2pm3k/VBqh+RRzty+V4fJBchhSxsC2b2ZiyUg==";
            urlBuilder.append("?" + URLEncoder.encode("ServiceKey","UTF-8") + "=" + URLEncoder.encode(serviceKey,"UTF-8")); /*Service Key*/
            urlBuilder.append("&" + URLEncoder.encode("pageNo","UTF-8") + "=" + URLEncoder.encode("1", "UTF-8")); /*페이지번호*/
            urlBuilder.append("&" + URLEncoder.encode("numOfRows","UTF-8") + "=" + URLEncoder.encode("10", "UTF-8")); /*한 페이지 결과 수*/
            urlBuilder.append("&" + URLEncoder.encode("startCreateDt","UTF-8") + "=" + URLEncoder.encode("20200410", "UTF-8")); /*검색할 생성일 범위의 시작*/
            urlBuilder.append("&" + URLEncoder.encode("endCreateDt","UTF-8") + "=" + URLEncoder.encode("20200410", "UTF-8")); /*검색할 생성일 범위의 종료*/

            return new URL(urlBuilder.toString());
        }
    }
}

 

bundle : Module

plugins {
    id 'com.android.application'
}

android {
    compileSdkVersion 31
    buildToolsVersion "31.0.0"

    defaultConfig {
        applicationId "com.example.final_exam1"
        minSdkVersion 16
        targetSdkVersion 31
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {

    implementation 'androidx.appcompat:appcompat:1.4.0'
    implementation 'com.google.android.material:material:1.4.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.2'
    //구글 위치 서비스
    implementation 'com.google.android.gms:play-services-location:18.0.0'
    implementation 'com.opencsv:opencsv:4.4'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

 

 

반응형