Lesson 11: Connect to the internet
💡 Teach Android Development
구글에서 제공하는 교육자료를 정리하기 위한 포스트입니다.
Android permissions
Permissions
앱은 민감한 사용자 데이터와 특정 시스템 기능에 대한 접근 권한을 요청해야 합니다.
- Android 사용자의 개인 정보를 보호합니다.
AndroidManifest.xml
에서<uses-permission>
태그로 선언합니다.
Permissions granted to your app
- 보호 레벨에 따라 설치 또는 런타임 중에 권한을 부여할 수 있습니다.
- 각 권한에는 일반, 서명, 위험과 같은 보호 레벨이 있습니다.
- 런타임 중에 부여된 권한의 경우 사용자에게 앱에 대한 접근 권한을 명시적으로 승인하거나 거부하라는 메시지를 표시합니다.
Permission protection levels
Add permissions to the manifest
AndroidManifest.xml
에 USE_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)
}
}
Author And Source
이 문제에 관하여(Lesson 11: Connect to the internet), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@haanbink/Lesson-11-Connect-to-the-internet저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)