[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'
}
반응형