Android Загрузить html файл на локальный сервер - PullRequest
0 голосов
/ 05 августа 2020

Я хочу создать приложение Android, которое будет запускать локальное HTTP server. Через этот сервер я хочу загрузить index.html в WebView. index.html не работает сам по себе. Это веб-приложение, которое необходимо инициализировать на локальном хосте. Также он запускает другие. js файлы внутри assets папки.

Чтобы запустить это раньше, я использовал python HTTP-сервер и запускал его оттуда в браузере.

Я использовал Ktor для создания простого HTTP-сервера, но показывает только пустую страницу. Я не знаю, правильно ли я придерживаюсь этого решения.

Все мое приложение:

import android.annotation.SuppressLint
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.webkit.WebView
import android.webkit.WebViewClient
import io.ktor.application.install
import io.ktor.features.ContentNegotiation
import io.ktor.gson.gson
import io.ktor.http.content.default
import io.ktor.routing.routing
import io.ktor.server.engine.embeddedServer
import io.ktor.server.netty.Netty

class MainActivity : AppCompatActivity() {

    private lateinit var webView: WebView
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        webView = findViewById(R.id.web_view)
        initHttpServer()
        initWebViewContent()
    }

    private fun initHttpServer(){
        embeddedServer(Netty, 8080) {
            install(ContentNegotiation) {
                gson {}
            }
            routing {
                default("/app/src/main/assets/index.html")
            }
        }.start(wait = true)
    }

    @SuppressLint("SetJavaScriptEnabled")
    private fun initWebViewContent(){
        webView.apply {
            loadUrl("http://127.0.0.1:8080")
            webViewClient = object : WebViewClient() {
                override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
                    view.loadUrl(url)
                    return false
                }
            }
            settings.apply {
                setSupportZoom(true)
                builtInZoomControls = true
                displayZoomControls = false
                javaScriptEnabled = true
                javaScriptCanOpenWindowsAutomatically = true
            }
        }
    }
}

Хорошо, мне не нужен HTTP-сервер - index. html может загружаться как: webView.loadUrl("file:///android_asset/index.html")

index.html помещается в подпапку /app/src/main/assets/, которая является папкой ресурсов по умолчанию для проекта Android.

1 Ответ

0 голосов
/ 06 августа 2020

Вы пытаетесь обслуживать, используя несуществующий файл. Папка assets упакована в APK, и вы можете получить к ней доступ только через AssetManager . Ktor не знает о AssetManager и использует стандартные средства для доступа к локальным файлам.

Я предлагаю скопировать все веб-ресурсы во внутреннее хранилище и обслуживать их оттуда ( filesDir - это путь к каталогу root):

private fun copyWebResources() {
    val files = assets.list("web")

    files?.forEach { path ->
        val input = assets.open("web/$path")
        val outFile = File(filesDir, path)
        val outStream = FileOutputStream(outFile)
        outStream.write(input.readBytes())
        outStream.close()
        input.close()
    }
}

Для сервера вы можете использовать следующую настройку:

embeddedServer(Netty, 3333) {
    install(ContentNegotiation) {
        gson {}
    }
    routing {
        static("static") {
            files(filesDir)
        }
    }
}

Вот пример папки assets структура:

web
  index.html
  script.js

Пример URL для loadUrl равен http://127.0.0.1:3333/static/index.html.

Также есть полный образец project .

...