Android设备如何在Flet的WebView中显示本地HTML文件?

问题描述 投票:0回答:1

我在 Android 中的 WebView 元素遇到问题。 我想用 JavaScript 和 CSS 显示本地 HTML 文件。

我的第一次尝试是直接使用本地文件: 当我使用

file://
方案时,它似乎不起作用。

所以我使用

http.server
创建了一个本地服务器,并调用
http://localhost:8000/file.html

import flet as ft
import http.server
import socketserver
import threading
import sys
import ssl

SERVER = "localhost"
PORT = 8000
HTML_DIRECTORY = "assets/html"


class HookHandler(http.server.SimpleHTTPRequestHandler):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, directory=HTML_DIRECTORY, **kwargs)

class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
    pass

def start_server():
    with ThreadedTCPServer((SERVER, PORT), HookHandler) as httpd:
        httpd.serve_forever()


def main(page: ft.Page):
    wv = ft.WebView(
        f"http://{SERVER}:{PORT}/file.html",
        expand=True
    )
    page.add(wv)

server_thread = threading.Thread(target=start_server)
server_thread.daemon = True
server_thread.start()
app = ft.app(main)

但是当我访问这些文件时,出现安全错误 ERR_CLEARTEXT_NOT_PERMITTED。我找不到在 WebView 组件中禁用此安全性的方法。

因此,我已将 SSL 添加到我的服务器,并使用

localhost
的自签名证书,然后调用
http://localhost:8000/file.html

import flet as ft
import http.server
import socketserver
import threading
import sys
import ssl

SERVER = "localhost"
PORT = 8000
HTML_DIRECTORY = "assets/html"


class HookHandler(http.server.SimpleHTTPRequestHandler):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, directory=HTML_DIRECTORY, **kwargs)

class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
    pass

def get_ssl_context(certfile, keyfile):
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
    context.load_cert_chain(certfile, keyfile)
    return context

def start_server():
    with ThreadedTCPServer((SERVER, PORT), HookHandler) as httpd:
        context = get_ssl_context("cert.pem", "key.pem")
        httpd.socket = context.wrap_socket(httpd.socket, server_side=True)
        print("Serving at port", PORT)
        httpd.serve_forever()


def main(page: ft.Page):
    wv = ft.WebView(
        f"https://{SERVER}:{PORT}/file.html",
        expand=True,
    )
    page.add(url_input, submit_btn, wv)


server_thread = threading.Thread(target=start_server)
server_thread.daemon = True
server_thread.start()
app = ft.app(main)

当我打开我的申请表时,它是空白的。 如果我在 Android 的 Firefox 浏览器中打开相同的 URL,我会看到安全警报(因为证书是自签名的),但我可以检查“我没问题,继续”并且 HTML 文件已正确呈现。

我的问题:如何用Flet的WebView显示本地文件?

经过大量搜索,我找到了一个不能让我满意的解决方法:修改

Androidmanifest.xml
以添加
android:usesCleartextTraffic="true"
属性。 但这意味着反编译APK,手动修改文件,编译一个新的APK,签署这个APK。 有没有办法在
flet build apk
命令中自动在此文件中添加自定义元素/属性?

python android webview localhost flet
1个回答
0
投票

修改

AndroidManifest.xml

  • 克隆模板存储库 (https://github.com/flet-dev/flet-build-template)。
  • 修改位于
    AndroidManifest.xml
    中的
    flet-build-template\{{cookiecutter.out_dir}}\android\app\src\main
    文件。
  • 构建时,使用
    --template-dir
    选项。

示例:

flet build apk --include-packages flet_webview --template-dir C:\Users\PhunkyBob\flet-build-template

APK 文件将使用此修改后的清单并正确签名。

© www.soinside.com 2019 - 2024. All rights reserved.