Files
Awin Huang 5d4e261181 vault backup: 2025-07-22 22:14:08
Affected files:
Too many files to list
2025-07-22 22:14:08 +08:00

2.6 KiB
Raw Permalink Blame History

tags, aliases, date, time, description
tags aliases date time description
2024-06-05 19:06:00

Ktor是由Kotlin提供的一個framwork。 要在Android使用Ktor需要在build.gradle加入以下的dependency:

implementation "io.ktor:ktor-server-core:2.0.1"            // Ktor的核心包  
implementation "io.ktor:ktor-server-jetty:2.0.1"           // 供Ktor使用的引擎包另外有Jetty, Tomcat, CIO可用
implementation "io.ktor:ktor-gson:1.2.5"
//    implementation "io.ktor:ktor-server-call-logging:2.0.1"    // 用於印出Request及Response的log用  
//    implementation "io.ktor:ktor-server-partial-content:2.0.1" // 用於支援PartialContent用  
//    implementation "io.ktor:ktor-server-cors:2.0.1"            // 用於支援CORS用  
//    implementation "io.ktor:ktor-server-html-builder:2.0.1"    // 用於回傳客製html用

packagingOptions裡,也需要加入以下的設定來必面編譯問題Ktor#^68d958

packagingOptions {
    exclude 'META-INF/*'
}

AndroidManifest.xml記得加入internet的權限

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

然後就是 HTTP Server 的 code 了,注意 Netty 在 Android 上不能用,要改用 Jetty 或是 CIO

import io.ktor.server.jetty.Jetty  
import io.ktor.server.engine.embeddedServer  
import io.ktor.server.routing.routing  
import io.ktor.server.routing.get  
import io.ktor.server.application.*  
import io.ktor.server.response.respondText

embeddedServer(Jetty, 9000) {  
    routing {  
        get("/") {  
            call.respondText("Hello, world!")  
        }  
    }
}.start(wait = false)

但是這段code會block所以需要一個thread把它包起來

Thread {
    httpEngine = embeddedServer(Netty, 8080) {  
        install(ContentNegotiation) {  
            gson {}  
        } 
        routing {  
            get("/") {  
                call.respond(mapOf("message" to "Hello world"))  
            }  

            get("/say/{something}") {  
                call.respond(mapOf("message" to "You say: " + call.parameters["something"]))  

                activity?.findViewById<TextView>(R.id.textView)?.text = "You say: " + call.parameters["something"]  
            }  
        } 
    }.start(wait = false)  
}.start()

參考來源

  • 如果沒有這一段會產生如下錯誤 ^68d958
13 files found with path 'META-INF/INDEX.LIST'.
Adding a packagingOptions block may help, please refer to
https://developer.android.com/reference/tools/gradle-api/7.4/com/android/build/api/dsl/ResourcesPackagingOptions
for more information