직접 풀어보기 8-1
2021-05-24
openFileInput(fileName) -> openFileInput(File(fileName))으로 변경 :) <- 저는 fileName을 그대로 사용하다 보니 에러가 있었던것 같습니다:)
(답글 주신 R님 감사합니다)
- 요약 -
1. 내장 메모리에서 파일을 읽거나 쓰는 일반적인 절차는 다음과 같습니다.
openFileOutput(), openFileInput()으로 파일 열기 |
read() 또는 write()로 파일 읽기/쓰기 |
close()로 파일 닫기 |
2. 내장 메모리의 저장 위치는 /data/data/패키지명/fines 폴더입니다.
3. 프로젝트의 /res/raw 폴더에 필요한 파일을 저장하여 사용할 수 있으나 읽기 전용으로만 가능합니다.
4. Device File Explorer는 AVD나 실제 안드로이드폰 내의 폴더와 파일에 접근하는 기능을 제공합니다.
5. SD 카드의 기본적인 경로에는 /sdcard를 사용하며, [Device File Explorer]에서 /storage/emulated/0에 접근합니다.
6. SD 카드의 파일을 좀 더 정밀하게 처리하려면 Environment 클래스의 정적 메소드를 이용해야 합니다.
7. SD 카드에 읽기, 쓰기를 하려면 AndroidManifest.xml에 퍼미션을 추가해야 하며, 마시멜로(Android 6.0, API 23)부터는 변경된 보안 모델을 적용해야 합니다.
8. 지정한 폴더의 하위 폴더 및 파일 목록에 접근하려면 File.listFiles()메소드를 사용합니다.
9. 커스텀 위젯을 만들려면 먼저 Kotlin 코드로 작성한 다음 activity_main.xml에서 <패키지명.클래스명> 형식을 사용합니다.
- 연습문제 -
1. 내장 메모리에 파일을 처리하는 Context 클래스의 메소드 2개와 내장 메모리의 저장 위치를 쓰시오.
답 :
메소드 ---> openFileInput(), openFileOutput()
내장 메모리의 저장 위치 ---> /data/data/패키지명/files 폴더(디렉터리)이다.
2. 다음과 같이 [예제 8-5]의 4~7행에서 4행을 생략한다면 5~7행을 어떻게 바꿔야 할지 빈칸을 채우시오.
답 :
[4~7행]
var cal = Calender.getInstance()
var cYear = cal.get(Calender.YEAR)
var cMonth = cal.get(Calender.MONTH)
var cDay = cal.get(Calender.DAY_OF_MONTH)
[5~7행]
var cYear = Calendar.getInstance().get(Calendar.YEAR)
var cMonth = Calendar.getInstance().get(Calendar.MONTH)
var cDay = Calendar.getInstance().get(Calendar.DAY_OF_MONTH)
3. 다음은 /res/raw 폴더의 mytext.txt 파일을 읽는 Kotlin 코드이다. 빈칸을 채우시오.
var inputS = ( 1 ) var txt = ( 2 ) inputS.read(txt) |
답 :
( 1 ) ---> resources.openRawResource(R.raw.파일이름)
( 2 ) ---> ByteArray(inputS.available())
4, SD 카드에서 파일을 읽거나 쓰기 위해 AndroidManifest.xml에 추가할 내용을 작성하시오.
답 :
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <application android:requestLegacyExternalStorage="true" |
5. 안드로이드 시스템 폴더의 경로를 구하려면 android.os.Environment 클래스의 getRootDirectory() 메소드를 사용한다. 그 외 Environment 클래스의 폴더 경로와 관련된 메소드를 조사하시오.
Environment 클래스의 메소드 이름 | Returns | 내용 |
getDataDirectory() | File | 유저 데이터 디렉터리 경로 출력 |
getDownloadCacheDirectory() | File | download/cache 디렉터리 경로 출력 |
getExternalStorageDirectory() (deprecated) | File | 외부 저장소 디렉터리 경로 출력 (API 29 추천 x) |
getExternalStorageState() | String | 공유/외부 저장소 미디어의 현재 상태 출력 |
getStorageDirectory() | File | 마운트 된 외부 저장소 루트 디렉토리 경로 출력 |
이하 생략
(★ 참고 : developer.android.com/reference/android/os/Environment#public-methods_1)
6. [직접 풀어보기 8-1]의 일기장 앱을 내장 메모리가 아닌 SD 카드의 myDiary 폴더에 저장되도록 수정하시오. 단, SD 카드에 myDiary가 없으면 Kotlin 코드에서 자동 생성되게 한다.
7. [직접 풀어보기 8-2]를 수정하여 그림이 가운데 위치하게 하시오.
[8-2]
★ drawBitmap() 관련해서 조금 이상한 점이 있습니다.
여기서 사용한 drawBitmap()메소드의 원형은
drawBitmap(Bitmap bitmap, float left, float top, Paint paint)입니다.
left와 top은 이미지를 그릴 시작 위치를 의미합니다.
상단의 이미지에서 구한 imgX와 imgY는 뷰의 크기가 어떠하든 (1080 x 1920px) 보다 작은
이미지라면 계산 할 시 정 중앙에 이미지가 놓이게 됩니다.
실제 예제에서 사용한 이미지 모두 너비와 높이가 500이 넘지 않는 이미지였습니다.
그러나 결과는
여러가지 고민을 많이 해보았지만 마땅한 해결책이 없는것 같았습니다.
실제 drawBitmap()의 left와 top의 가장 끝점이 540f와 730f 였습니다.
540 x 730 (사실은 1920의 절반이지만 상단의 버튼이 있어서 960이 아니라 730)인 셈입니다.
따라서
너비는 this.width / 2로 나눈후에 계산을 해주어야 하며
높이의 경우 버튼의 너비만큼을 빼준 후 2로 나누어서 계산해야 합니다.
즉, this.width와 this.height이 해당 레이아웃의 너비와 높이가 아닌
전체 레이아웃의 너비와 높이(px)로 계산되며(1080, 1920) 이것은 실제 AVD나 안드로이드 폰의
디스플레이 너비(단위)와도 맞지 않습니다.
혹시 이것에 대해서 자세히 알고 계신분이 있다면 답글 부탁드립니다 :)
'책 요약하기 > 코틀린을 활용한 안드로이드 프로그래밍' 카테고리의 다른 글
#10. 액티비티와 인텐트 2021-02-17 (0) | 2021.02.17 |
---|---|
#9. 그래픽과 이미지 2021-02-14 (0) | 2021.02.14 |
#7.메뉴와 대화상자 2021-02-05 (0) | 2021.02.05 |
#6. 고급 위젯 다루기 2021-02-03 (0) | 2021.02.03 |
#5. 레이아웃 익히기 2021-01-29 (0) | 2021.01.29 |