Lesson 11: Connect to the internet

10487 단어 androidkotlinandroid

💡 Teach Android Development

구글에서 제공하는 교육자료를 정리하기 위한 포스트입니다.

Android Development Resources for Educators

Android permissions

Permissions

앱은 민감한 사용자 데이터와 특정 시스템 기능에 대한 접근 권한을 요청해야 합니다.

  • Android 사용자의 개인 정보를 보호합니다.
  • AndroidManifest.xml에서 <uses-permission> 태그로 선언합니다.

Permissions granted to your app

  • 보호 레벨에 따라 설치 또는 런타임 중에 권한을 부여할 수 있습니다.
  • 각 권한에는 일반, 서명, 위험과 같은 보호 레벨이 있습니다.
  • 런타임 중에 부여된 권한의 경우 사용자에게 앱에 대한 접근 권한을 명시적으로 승인하거나 거부하라는 메시지를 표시합니다.

Permission protection levels

Add permissions to the manifest

AndroidManifest.xmlUSE_BIOMETRIC 권한을 추가합니다. USE_BIOMETRIC 권한을 통해 생체 인식 방식을 사용할 수 있습니다. 일반 보호 레벨이며 앱 설치 시 부여됩니다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.sampleapp">
    <uses-permission android:name="android.permission.USE_BIOMETRIC" />
    <application>
        <activity
            android:name=".MainActivity" ... >
            ...
        </activity>
    </application>
</manifest>

Internet access permissions

앱이 네트워크 작업을 수행해야 하는 경우 AndroidManifest.xml에 아래 권한을 선언해야 합니다. 일반 레벨이므로 추가 작업이 필요하지 않습니다.

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

Request dangerous permissions

  • 위험한 권한이 필요한 기능에 접근할 때 사용자에게 권한을 부여하라는 메시지를 표시합니다.
  • 권한이 필요한 이유를 사용자에게 설명합니다.
  • 사용자가 권한을 거부하면 정상적으로 복귀해야 합니다.(앱은 계속 작동해야 함.)

App permissions best practices

  • 앱이 작동하는 데 필요한 권한만 사용합니다.
  • 라이브러리에 필요한 권한을 주의합니다.(라이브러리에서 권한이 사용되는 용도를 알아야 함.)
  • 투명해야 합니다.(접근 대상과 이유를 명확하게 함.)
  • 시스템 접근을 명식적으로 만듭니다.(민감한 기능에 접근할 때 지속적인 표시를 제공함.)

Connect to, and use, network resources

Retrofit

  • HTTP API를 Kotlin 및 Java 인터페이스로 전환하는 네트워킹 라이브러리.
  • 앱에서 사용할 객체로 요청 및 응답을 처리할 수 있습니다.
  • XML 및 JSON과 같은 일반적인 Response 타입 파싱을 제공합니다.
  • 다른 응답 타입을 지원하도록 확장할 수 있습니다.

Why use Retrofit?

  • OkHttp와 같은 산업 표준 라이브러리를 기반으로 합니다.
    • HTTP/2 지원
    • Connection pooling
    • 응답 캐싱 및 보안 강화
  • 요청을 실행하는데 필요한 기본 설정에서 개발자가 할 일이 적습니다.

Add Gradle dependencies

앱 Gradle 파일에 종속성을 추가합니다. JSON에서 객체로의 변환을 위해 Moshi를 사용합니다.

implementation "com.squareup.retrofit2:retrofit:2.9.0"
implementation "com.squareup.retrofit2:converter-moshi:2.9.0"

implementation "com.squareup.moshi:moshi:$moshi_version"
implementation "com.squareup.moshi:moshi-kotlin:$moshi_version"
kapt "com.squareup.moshi:moshi-kotlin-codegen:$moshi_version"

Connect to a web service

HTTP methods

  • GET
  • POST
  • PUT
  • DELETE

Example web service API

Define a Retrofit service

@Path : 동적으로 URL에 대해 작동하는 함수를 만들 수 있습니다.
@Query : 쿼리 매개변수를 추가할 수 있습니다.
@Body : HTTP 요청 Body에 전달할 수 있습니다.

interface SimpleService {

    @GET("posts")
    suspend fun listPosts(): List<Post>

    @GET("posts/{userId}")
    suspend fun listByUser(@Path("userId") userId:String): List<Post>

    @GET("posts/search")  // becomes post/search?filter=query
    suspend fun search(@Query("filter") search: String): List<Post>

    @POST("posts/new")
    suspend fun create(@Body post : Post): Post
}

Create a Retrofit object for network access

Retrofit.Builder() 를 사용하여 Retrofit 객체를 생성합니다.
서비스 인터페이스를 사용하여 서비스의 구체적인 구현을 만듭니다.

val retrofit = Retrofit.Builder()
    .baseUrl("https://example.com")
    .addConverterFactory(...)
    .build()

val service = retrofit.create(SimpleService::class.java)

End-to-end diagram

Converter.Factory

Response 를 클래스 객체로 변환하는 데 도움이 됩니다.

  • JSON (Gson or Moshi)
  • XML (Jackson, SimpleXML, JAXB)
  • Protocol buffers
  • Scalars (primitives, boxed, and Strings)

Moshi

  • JSON을 객체로 파싱하고 그 반대로 파싱 하기 위한 JSON 라이브러리.
  • 앱의 Gradle 파일에 Moshi 라이브러리 종속성을 추가합니다.
  • Retrofit과 함께 사용하도록 Moshi 빌더를 구성합니다.

Moshi JSON encoding

매핑을 수행하는 어댑터를 자동으로 생성하기 위해 generateAdapter = true로 설정했습니다.

@JsonClass(generateAdapter = true)
data class Post (
    val title: String,
    val description: String,
    val url: String,
    val updated: String,
    val thumbnail: String,
    val closedCaptions: String?)

JSON code

다음은 JSON 응답입니다. Moshi는 이 응답을 객체로 변환합니다.

{
    "title":"Android Jetpack: EmojiCompat",
    "description":"Android Jetpack: EmojiCompat",
    "url":"https://www.youtube.com/watch?v=sYGKUtM2ga8",
    "updated":"2018-06-07T17:09:43+00:00",
    "thumbnail":"https://i4.ytimg.com/vi/sYGKUtM2ga8/hqdefault.jpg"
}

Set up Retrofit and Moshi

서비스를 인스턴스화하는 동시에 MoshiConverterFactory 설정하는 방법입니다.

private val moshi = Moshi.Builder()
    .add(KotlinJsonAdapterFactory())
    .build()
val retrofit = Retrofit.Builder()
    .addConverterFactory(MoshiConverterFactory.create(moshi))
    .baseUrl(BASE_URL)
        .build()
object API {
    val retrofitService : SimpleService by lazy {
        retrofit.create(SimpleService::class.java)
    }
}

Use Retrofit with coroutines

ViewModel에서 코루틴을 시작합니다.

viewModelScope.launch {
    Log.d("posts", API.retrofitService.searchPosts("query"))
}

Display images

Glide

  • Android의 Third-party 이미지 로딩 라이브러리.
  • 부드러운 스크롤을 위한 성능에 초점.
  • 이미지, 비디오 스틸 및 애니메이션 GIF 지원.

Add Gradle dependency

implementation "com.github.bumptech.glide:glide:$glide_version"

Load an image

Glide를 lifecycle owner에 연결하고 지정된 URL의 이미지를 ImageView에 로드합니다.

Glide.with(fragment)
    .load(url)
    .into(imageView);

Customize a request with RequestOptions

  • 이미지 crop 적용.
  • transitions 적용.
  • placeholder, error 이미지 옵션 설정.
  • 캐싱 정책 설정.

RequestOptions example

@BindingAdapter("imageUrl")
fun bindImage(imgView: ImageView, imgUrl: String?) {
    imgUrl?.let {
        val imgUri = imgUrl.toUri().buildUpon().scheme("https").build()

        Glide.with(imgView)
            .load(imgUri)
            .apply(RequestOptions()
                .placeholder(R.drawable.loading_animation)
                .error(R.drawable.ic_broken_image))
            .into(imgView)
    }
}

좋은 웹페이지 즐겨찾기