📱테스트 환경
Samsung Galaxy Tab Advanced2
여기에 이어서 .. 이미지를 이제 Web 으로 보내줘야하는데 .. 문제가 Content API 이미지 주소는 보안상 사용할 수가 없다.
그래서 이걸 보안에 걸리지않도록 보내줘야하는데 .. Base64 로 바꿔서 보내주니까
용량이 커질수록 너무 느려져서 문제였다. 사진은 그나마 좀 괜찮았는데 영상은 아주 끔찍한 유저 경험이라 할 수 있다.
그래서 생각해낸 방법이 Android 에서 Web 처럼 주소를 띄워놓고
그걸 Web 에서 받아 blob 로 변환해서 저장하는 방식을 생각했다.
그래서 사용한게 NanoHTTPD 인데 사용방법이 생각보다 간단해서 선택하게 되었다.
// build.gralde (Module :app)
implementation 'org.nanohttpd:nanohttpd:2.3.1'
종속성 먼저 추가해 주고
// MainActivity.kt
private lateinit var webServer: WebServer
override fun onCreate(savedInstanceState: Bundle?) {
...
webServer = WebServer(applicationContext).apply {
start()
}
...
}
override fun onDestroy() {
super.onDestroy()
webServer.stop()
}
만들어졌을 때 웹서버를 가동시키고 앱이 종료될때 웹을 종료해주었다.
class WebServer(private val context: Context) : NanoHTTPD(8080) {
override fun serve(session: IHTTPSession): Response {
val uri = session.uri.removePrefix("/")
return try {
val contentUri = Uri.parse(uri)
val inputStream = context.contentResolver.openInputStream(contentUri)
?: return newFixedLengthResponse(Response.Status.NOT_FOUND, MIME_PLAINTEXT, "File not found")
val mine = context.contentResolver.getType(contentUri) ?: "application/octet-stream"
val response = newChunkedResponse(Response.Status.OK, mine, inputStream)
response.addHeader("Access-Control-Allow-Origin", DEFAULT_BASE_URL.removeSuffix("/"))
response.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT")
response.addHeader("Access-Control-Allow-Headers", "Content-Type, Accept, baggage, sentry-trace")
response.addHeader("Access-Control-Allow-Credentials", "true")
response.addHeader("Cache-Control", "no-cache")
response
} catch (e: IOException) {
e.printStackTrace()
newFixedLengthResponse(Response.Status.INTERNAL_ERROR, MIME_PLAINTEXT, "Internal server error")
}
}
}
나는 Appconfig 에 DEFAULT_BASE.URL 을 정의해놓고 쓰다보니 저렇게 사용했지만 간단한 테스트라면 "*"
설정해놓고 먼저 테스트해보는것도 좋았다.
url 에서 앞의 "/" 를 제거한 이유는 주소가 "/content:// ~" 이런식으로 시작되다보니 제거해주었고
sentry 를 사용중이다보니 해당 헤더 추가해줬고, baggage 도 추가해줬다.
이렇게 하고 Web 으로 이미지나 동영상 주소를 전달해주고 해당 주소를 이용해 Blob 형태로 만들어서 사용하는데 성공
https://github.com/NanoHttpd/nanohttpd
'Android > Kotlin' 카테고리의 다른 글
[Kotlin] A problem was found with the configuration of task (0) | 2024.04.08 |
---|---|
[Kotlin] com.android.ide.common.signing.KeytoolException (0) | 2024.04.08 |
[Kotlin] WebView Input 파일 선택 (0) | 2024.04.03 |
[Kotlin] onBackPressed deprecated ... -> OnBackPressedCallback (1) | 2024.03.22 |
[Kotlin] screenOrientation - 가로모드, 세로모드 (0) | 2024.03.22 |