1. 사용자 인증키 만들기

 

구글 클라우드 들어가기

https://console.cloud.google.com/

 

Google 클라우드 플랫폼

로그인 Google 클라우드 플랫폼으로 이동

accounts.google.com

 

프로젝트 선택 -> 새 프로젝트 -> 프로젝트 이름 기입 -> 만들기

프로젝트 선택

새 프로젝트

프로젝트 이름 기입 후 만들기

 

 


저의 경우 이미 만들어놓은 PracticeGoogleMap으로 진행하겠습니다.

왼쪽 상단의 메뉴 이미지 > API 및 서비스 > 사용자 인증 정보

 

 

 

 

해당 프로젝트 선택 후 API 및 서비스 > 사용자 인증 정보

 

 

 

사용자 인증 정보 만들기

 

 

사용자 인증 정보 만들기

 

 

API키 

 

 

API키

 

↓ 

 

그럼 해당 키가 나옵니다. 지금 부터는 옵션인데 제한 사항을 세팅하는 과정입니다.

제한 사항을 추가안하실 분들은 이 부분은 넘기셔도 됩니다.

현재 내 프로젝트만 사용 가능하게끔 제한을 걸기위해선 패키지명과 SHA-1 값이 필요합니다.

안드로이드 스튜디오 터미널 창을 열어 해당 코드를 쳐줍니다.

 

./gradlew signingReport

 

 

아래와 같이 SHA1 값을 복사해줍니다.

 

 

SHA-1 인증서 디지털 지문 입력란에 붙여넣기

 

 

 

구글 맵 API를 이용할거기에 Maps SDK for Android 선택

 

 

API Key 값 복사

 

 

 

 

2. 안드로이드 스튜디오 Manifest 및 gradle 설정

 

<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"/>

 

매니페스트 파일에 사용자 권한 추가

 

Android 스튜디오에서 프로젝트 수준 build.gradle 파일을 열고 다음 코드를 buildscript 아래 dependencies 요소에 추가합니다.

plugins {
    ...
    id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin") version "2.0.1" apply false
}

 

그런 다음 모듈 수준 build.gradle 파일을 열고 plugins 요소에 다음 코드를 추가합니다.

plugins {
    ...
    id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
}

 

모듈 수준 build.gradle 파일 dependencies 요소에 다음 코드를 추가합니다.

dependencies {

    ...
    
    // GoogleMap
    implementation("com.google.android.gms:play-services-maps:18.2.0")
    // (옵션) GPS 이용해서 위치 확인
    implementation("com.google.android.gms:play-services-location:21.1.0")
}
  1. 파일을 저장하고 프로젝트를 Gradle과 동기화합니다.
  2. 프로젝트 수준 디렉터리에서 local.properties를 열고 다음 코드를 추가합니다. YOUR_API_KEY를 API 키로 변경합니다.
  3. API 키를 AndroidManifest.xml 파일에 그대로 추가하지 마세요. 그렇게 하면 API 키가 안전하지 못한 방식으로 저장됩니다. 아래와 같이 loacal.properties 파일에 저장 후 Manifest 파일에서 참조하여 사용하세요.

MAPS_API_KEY=YOUR_API_KEY

 

AndroidManifest.xml 파일에서 com.google.android.geo.API_KEY로 이동한 후 android:value attribute를 다음과 같이 업데이트합니다.

<meta-data
    android:name="com.google.android.geo.API_KEY"
    android:value="${MAPS_API_KEY}" />

 

이러면 환경설정은 끝

Android 데이터 저장 3가지 방법

1. DB 데이터 베이스에 데이터 저장하기 (ROOM, SQLite 등)

2. SharedPreferences를 이용해 데이터 저장하기

3. 파일 형태로 저장하기 (주로 FileWriterBufferedWriter 등을 사용)

 

여기선 SharedPreferences에 대해서 알아보자.

sharedPreferences란 무엇일까?

안드로이드 앱 개발을 할 때 데이터 저장이 필요한 순간은 반드시 온다.

많은 양의 데이터나 중요한 데이터들은 DB에 저장하는게 바람직하지만 보통 간단한 프로그램 설정 정보들은 sharedPreferences를 이용해서 데이터를 저장한다.

안드로이드에서 기본적으로 제공하는 클래스이기에 따로 gradle설정 필요x

 

한줄 요약 : 

프로그램의 설정 정보 (사용자의 옵션 선택 사항 이나 프로그램의 구성 정보)를 영구적으로 저장하는 용도로 사용

예) 알림 권한 설정 여부, 자동 로그인 설정 여부 등

 

sharedPreferences 특징

간단한 키-값 쌍의 데이터를 저장하기 위한 메커니즘을 제공

기본적으로 SharedPreferences는 내부적으로 XML 파일로 데이터를 저장

주로 앱의 구성 설정, 사용자 기본 설정, 애플리케이션 상태 등을 저장하는 데 사용

 

사용 방법

SharedPreferences에 데이터 저장하기

private fun saveData() {
    val pref = getSharedPreferences("pref", MODE_PRIVATE)
    val editor = pref.edit()  //수정 모드

    // 첫 번째는 key, 두 번째는 value
    editor.putString("name", binding.etText.text.toString())
    editor.apply() // 저장 완료
}

 

pref라는 변수에 SharedPreferences 객체 저장 pref는 파일 이름이며 뒤에 모드는 현재 이 파일은 앱 내에서만 접근 가능하도록 하는 모드다. ( + 모드에 대한 설명은 따로 밑에 적어두었어요.)

 

.edit() 은 SharedPreferences의 Editro 객체를 반환하는 메소드로, 파일을 변경할 수 있게 만들어주는 녀석이라고 생각하면 된다.

 

.put자료형을 통해서 첫 번째 인자에 키 값을 넣고 두 번째 인자에 실제 저장할 value값을 넣어주면 된다.

.apply()로 변경 사항을 저장한다. (저장하는 방법은 [apply, commit] 두 가지가 있다. 둘의 차이도 따로 밑에 정리해놨다.)

 

SharedPreferences에 있는 데이터 가져오기 

private fun loadData() {
    val pref = getSharedPreferences("pref", 0)

    // 첫 번째는 key, 두 번째는 데이터가 없을 경우 default value -> 저장하지 않은 경우도 생각해야 한다.
    binding.etText.setText(pref.getString("name", ""))
}

 

저장한 데이터를 세팅할 때는 마찬가지로 pref라는 변수에 해당 파일이 담긴 객체를 전달해준다.

뒤에 0은 MODE_PRIVATE을 의미하며 0으로 대체하여 사용가능하다. 

 

애플리케이션에서 SharedPreferences 데이터 저장 확인 방법

 

Device Explorer에 가서 data -> data -> [현재 프로젝트 이름] 을 찾는다.

 

프로젝트를 열어보면 shared_prefs 폴더가 있다. 그 안에 우리가 저장한 XML 파일을 찾아볼 수 있다.

 

pref.xml을 열어보면 저장한 데이터 map 형태로 잘 담겨있다.

 

SharedPreferences 모드 설명

 

SharedPreferencesmode 매개변수는 해당 SharedPreferences 파일의 액세스 권한 및 공유 범위를 정의합니다.

모드의 종류로는 다음과 같이 4가지가 있다.

MODE_PRIVATE
MODE_WORLD_READABLE
MODE_WORLD_WRITEABLE
MODE_MULTI_PROCESS

// 인터페이스 내용
@IntDef(flag = true, prefix = { "MODE_" }, value = {
            MODE_PRIVATE,
            MODE_WORLD_READABLE,
            MODE_WORLD_WRITEABLE,
            MODE_MULTI_PROCESS,
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface PreferencesMode {}

 

 

현재 MODE_PRIVATE 을 제외한 옵션은 Deprecated(사용이 권장되지 않음)되었다.

 

MODE_WORLD_READABLE 이 모드를 사용하면 다른 앱에서 해당 SharedPreferences 파일을 읽을 수 있다.

MODE_WORLD_WRITEABLE 이 모드를 사용하면 다른 앱에서 해당 SharedPreferences 파일을 수정할 수 있다.

위의 두가지 모드는 현재 보안 이슈로 인해 Deprecated되었고, API 레벨 23에서는 사용 중지되었습니다.

 

 

MODE_MULTI_PROCESS 다중 프로세스 간에 SharedPreferences 파일을 공유할 수 있도록 한다. API 레벨 23에서 Deprecated 되었고, API 레벨 30에서는 완전히 사용이 중지되었다. 이를 대체하기 위해, 다중 프로세스 간에 데이터를 공유해야 하는 경우에는 ContentProvider, BroadcastReceiver 및 일부 동기화 기술을 사용하는 것이 권장된다고 한다.

 

commit, apply 차이

commit 모드

  • commit 메소드는 동기적으로 동작하며, 변경 사항을 즉시 SharedPreferences에 기록한다.
  • 모든 변경 사항이 저장소에 성공적으로 쓰여질 때까지 commit 메소드는 블록된다. 따라서 호출자는 commit의 반환 값을 통해 변경 사항이 성공적으로 저장되었는지 여부를 확인할 수 있다.
boolean success = editor.commit()
if (success) {
    // 변경 사항이 성공적으로 저장됨
} else {
    // 변경 사항 저장 실패
}

 

apply 모드

  • apply 메소드는 비동기적으로 동작하며, 변경 사항을 즉시 메모리에 적용한 다음, 백그라운드에서 비동기적으로 디스크에 저장소에 커밋한다.
  • apply 메소드는 즉시 반환되므로 호출자는 변경 사항의 저장 성공 여부에 대한 피드백을 받을 수 없다. 따라서 호출자는 비동기적으로 변경 사항이 저장되는 것을 기다리거나 확인할 방법이 없다.
editor.apply()
// 변경 사항이 비동기적으로 저장되므로 피드백이 없음

 

일반적으로, 변경 사항이 성공 여부를 확인하고 결과에 따라 추가 작업이 필요한 경우에는 commit을 사용하고, 결과에 대한 피드백이 필요하지 않거나 비동기적으로 처리해도 무방한 경우에는 apply을 사용하는 것이 적절하다.

프로젝트를 할 때 마다 기본 버튼을 쓰니 튜터님들께서 디자인쪽으로 신경을 좀 쓰는게 좋을 것 같다는 피드백을 주셨다.

 

색이나 폰트 크기 등에 조금만 신경을 써도 생각보다 미적으로 보기가 편하긴 하다.

 

그래서 버튼에 조금이나마 디자인적인 요소를 넣을 수 있는 방법과 색상 변경이 안될 때 대처 방법을 소개한다.

 

간단하다.

 

 

이런 심플한 버튼을 하나 만든다.

 

그리고 drawable에서 drawable Resource File을 하나 만들어준다. root element에는 shape을 넣어주면 된다.

 

 

그리고 안에 내용물들을 채워주면 되는데 각각 태그들의 설명을 하자면.

 

solid 에서는 color를 통해 배경색을 지정해준다.

 

corners 에서는 radius를 통해 모서리부분에 대한 라운드 처리를 해준다.

 

size에서는 width와 height을 통해 사이즈를 지정해준다. (동일한 버튼이 여러개라면 이곳에서 지정해주는게 관리포인트를 줄일 수 있다.)

 

stroke에서는 width로 테두리 너비를 지정하고 color로 테두리 색을 지정해준다.

 

다 코드를 쳐주고 돌아와서 

android:background="@drawable/chat_background_pumpkin"

 

백그라운드에 넣어주면 버튼 디자인이 입혀지게된다.

 

그.런.데 여기서 안되는 나같은 사람도 있을 수 있을 것이다.

 

다 꾸며놨는데 디자인이 적용이 안되는 상황이 발생해버렸다.

 

하지만 해결방법은 너무나 간단했다.

 

<Button
    android:id="@+id/detail_item_chat"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginEnd="15dp"
    android:background="@drawable/chat_background_pumpkin"
    android:text="채팅하기"
    android:textSize="17sp"
    android:textStyle="bold"
    android:textColor="@color/white"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

 

기존에 이렇게 되어잇던 버튼 태그를..

 

<android.widget.Button

 

이런식으로 바꿔주면 적용이 된다.

 

안드로이드에서 기본 제공하는 폰트들도 괜찮지만 좀 더 예쁜 폰트들을 쓰고 싶을 때가 있다.

기본적인 폰트 변경 방법과 폰트 다운로드 과정 및 적용 과정을 소개한다.

 

우선 무료로 사용가능한 폰트들을 다운 받을 수 있는 사이트를 소개한다.

 

https://noonnu.cc/

 

눈누

상업용 무료한글폰트 사이트

noonnu.cc

 

간단히 폰트(Font)에 대해서 알아보자면, 폰트는 컴퓨터로 표현되는 디지털 글꼴이며 쉽게 이미지와 마찬가지로 글자를 이루는 데이터의 집합이라고 생각하면 된다. 

 

글꼴의 표현방식으로는 비트맵 글꼴과 벡터 글꼴이 있는데 너무 자세히 다루진 않고 그냥 간단히만 알자.

비트맵(bitmap) 글꼴은 픽셀(Pixel)이 모여 전체 글꼴을 구성하는 방식이고 벡터(Vector) 글꼴은 점과 점 사이의 곡선으로 이미지를 구성하는 방식이다.

 

벡터 글꼴이 크기를 변경해도 깨지지 않는 장점이 있어 오늘날 많이 쓰인다고 한다.

폰트를 다운 받을 때 보면 OTF(오픈타입)와 TTF(트루타입) 중 선택해서 다운 받으라고 하는 걸 보게 될 것이다.

OTF TTF 둘 다 모두 벡터글꼴의 저장 형식을 나타내는 포맷이다. 둘의 가장 큰 차이는 곡선을 구현하는 방식의 차이인데 현재로서는 크게 중요하지 않기 때문에 다음에 기회가 되면 포스팅하겠다.

 

쉽게 OTF는 고해상도 출력 작업이 필요한 사용자(디자이너, 그래픽전문가 등)들이 사용하는 버전이라 생각하면 되고

우리는 일반 문서 작업에 적합한 TTF 다운 받으면 된다. 

 

각설하고 우선 안드로이드 스튜디오의 res 패키지 밑에 font 디렉토리를 하나 생성하자.

 

이후 원하는 폰트의 TTF를 다운받자.

폰트사이트에 들어가 원하는 폰트를 클릭하면 설치 페이지로 이동이라는 버튼이 있다. 누르고 페이지를 찾아보면 타입폰트가 나누어져 있다.우리는 true type font 인 ttf를 다운받자.

 다운로드 받고 해당.ttf 파일을 복사하여 font 디렉토리에 붙여넣기 해준다.

 

나의 경우 string들을 한꺼번에 관리해주기 위해 values에 styles.xml을 만들어서 fontfamily에 폰트를 먹였다.

결과는??

이쁘게 폰트가 잘 설정 되었다.

'Android Studio' 카테고리의 다른 글

Android Fragment Lifecycle  (1) 2023.12.18
Android Studio WebView 사용법 및 ERR_CACHE_MISS 해결법  (0) 2023.12.14
Android Studio Activity Lifecycle  (0) 2023.12.13
Android Studio UI - Layout  (0) 2023.12.12
Android Studio UI - View  (0) 2023.12.11

레이아웃이란?

ViewGroup의 파생 클래스로서, 포함 된 View를 정렬하는 기능

 

레이아웃의 종류

01. Linear Layout (*Orientation -> vertical or horizontal)

  • 컨테이너에 포함 된 뷰들을 수평 또는 수직으로 일렬 배치하는 레이아웃
  • 자식 뷰를 수평,수직으로 일렬 배치하는 레이아웃으로, 가장 단순하고 직관적이며 사용빈도가 높다.
  • LinearLayout의 자식(Children)으로 배치되는 View위젯들은 오직 한 방향 (가로 또는세로)으로만 배치
  • 위젯의 크기(높이 또는 너비)와 관계없이 한 줄로만 배열
  • 아래 그림과 같이 가로 방향으로 배치 될 때는 가로로 한 줄(onlyonerow)
  • 세로 방향으로 배치될 때는 세로로 한 줄(onlyonecolumn)로 표시
  • LinearLayout의 자식들은 중첩(overrap)되지 않고,지정한 방향으로 쌓이는(stacked)형태로 표시
  • LinearLayout은 자식(Children)들이 배치 될 때,전체 영역 대비 비율의개념으로지정할수있는Weight(가중치)를 설정
  • 예) 전체 크기를 10으로 본다면, 첫 번째 View위젯은 3, 두 번째View위젯은7의영역을차지하도록 만듦

02. Relative Layout

  • 뷰를 서로 간의 위치 관계나 컨테이너와의 위치 관계를 지정하여 배치하는 레이아웃
  • RelativeLayout은 자식(Children)View위젯들이 서로 간의 상대적 배치 관계에 따라 화면에 표시 될 위치가 결정되도록 만들어주는Layout클래스
  • 예)"A를 화면에 표시하고 B는A의 오른쪽에 표시”,"C를 첫번째 자식으로 두고 D가 C아래에 위치하도록 배치”
  • View위젯들을 포함하는 Relative Layout(View위젯 입장에서는 부모(Parent))자체가 상대적 위치의 기준점으로 사용될수도있습니다.
  • 만약 RelativeLayout의 자식(Children)들에 "상대적인"배치 기준을 지정하지 않는다면, RelativeLayout내부에서 중첩되어 표시된다

03. Table Layout

  • 표 형식으로 차일드를 배치하는 레이아웃
  • 자식(Children) View위젯들을 테이블(행과 열로 구성)로 나누어 표시하는 Layout클래스

  • stretchColumns : 늘릴 열을 지정(인텍스는 0부터 시작 됨)

TableRow

  • 정해진 규칙에 따라 크기가 결정되므로, layout_width/height를 지정할 필요가 없다.

04. Frame Layout

  • 컨테이너에 포함된 뷰들을 전부 좌상단에 배치하는 레이아웃
  • 하나의 자식 View위젯만 표시 할 때 사용하는 Layout클래스
  • FrameLayout에 여러 View위젯을 자식으로 추가하면 겹쳐진 형태로 표시되며,가장 최근에 추가된 View위젯이 가장 상위(ontop)에 표시

  • 모든 자식 View는 좌상단에 배치되며,여러 개의 자식View를 포함하는 경우나 열된순서대로 겹쳐져서 표시 됨

05. Constraint Layout

  • 제약 조건을 사용해 화면을 구성하는 방법
  • 복잡한 레이아웃을 단순한 계층구조를 이용해 표현 할 수 있는 ViewGroup
  • 형제 View들과의 관계를 정의해서 레이아웃을 구성한다는 점은 RelativeLayout과 비슷하지만 보다 유연하고 다양한 기능을 제공함
  • RelativeLayout에선 불가능했던 자식 뷰간의 상호 관계 정의 가능
  • ex)두개의 View를 위아래로 붙여서 컨테이너 중앙에 배치하기
  • LinearLayout을 써야만 했던 뷰비율 조절도 간단히 가능
  • 뷰계층을 간단하게 할 수 있어 유지보수도 좋고 성능도 좋고!

'Android Studio' 카테고리의 다른 글

Android Studio 폰트 설정 및 적용 방법  (0) 2023.12.13
Android Studio Activity Lifecycle  (0) 2023.12.13
Android Studio UI - View  (0) 2023.12.11
Android Studio Bookmarks 활용  (0) 2023.12.11
안드로이드가 뭐야?  (0) 2023.12.11

안드로이드 스튜디오 왼쪽 하단에 보면 북마크 기능이 있다.

잘 활용하면 코드찾는 수고를 덜 수 있다.

Bookmarks -> crtl + shift + 지정 숫자

북마크를 원하는 코드줄로 가서

crtl + shift + 1 로 지정할 경우 아래와 같이 코드파일과 북마크에 1상자와 함께 생성된다. 

다른 코드를 보다가 북마크에 추가한 코드를 보고싶을 땐 crtl + 지정 숫자를 누르면 지정 숫자로 북마크에 추가한 코드줄로 이동하게 된다.

 

코드가 짧을 땐 별로 안쓰일 수 있지만 길 땐 정말 잘 활용될 것 같다.

+ 북마크 제거할때도 마찬가지로 crtl + shift +지정 숫자 로 제거 가능하고 북마크탭에서도 delete가능하다.

+ Recent posts