Match patterns
再建立 app 要與 GeckoView 通訊的 javascript 程式,在本例為 background.js
background.js
WWW
動機:
因為 GeckoView 的顯示效果比 Android 系統內建 WebView 元件強上許多,所以想探索是否能以 GeckoView 取代 WebView,達到 WebView.loadDataWithBaseURL() 的目的。
先說結論:截至目前為止(2023.09.09), GeckoView 版本為 117.0.20230824132758 之際,
無法實作動態顯示本機網頁,只能顯示靜態網頁,原因在:
GeckoView 目前尚 不支援 url 為 resource://... 的 scheme
所以當您想顯示動態內容網頁,而網頁又引入了 css、javascript... 等檔案,則這些 css、javascript...檔案必須置放在 internet 的網站上,然後呼叫 loadString(html string)。
下面的筆記就先不予理會了...
有時候我們並不是要去下載某個網站的網頁,而是想利用 GeckoView 顯示 HTML+CSS 豐富的版面樣式,要讓 app 和 GeckoView 能互傳訊息,這就要利用 WebExtension(擴充套件) 的功能。
開發工具:Android Studio Chipmunk 2021.2.1 Patch 2
在 /assets 內建立要置放 javascript 、 CSS 和 WebExtension 的目錄,並將需要的檔案分別置放於內;再建立一個 html 首頁檔,該網頁的 <head> 區塊要引入前述的 javascript 和 css。
WebExtension 在 GeckoView 和 app 之間扮演重要的角色,是兩者的溝通橋樑。
每建立一個 WebExtension,WebExtension 要有自己的目錄,在本例,我們建立 /assets/messaging/ ,然後每個 WebExtension 要有自己的 manifest.json
manifest.json
{
"manifest_version": 2,
"name": "messaging",
"version": "1.0",
"description": "Example messaging web extension.",
"browser_specific_settings": {
"gecko": {
"id": "messaging@example.com"
}
},
"content_scripts": [
{
// "matches": ["*://*.twitter.com/*"],
"matches": ["*://*/*.htm"],
"js": ["messaging.js"]
}
],
"permissions": [
// "activeTab",
"nativeMessaging",
"nativeMessagingFromContent",
"geckoViewAddons"
]
}
background.js
// Establish connection with app
let port = browser.runtime.connectNative("browser");
port.onMessage.addListener(response => {
// Let's just echo the message back
port.postMessage(`Received: ${JSON.stringify(response)}`);
});
port.postMessage("Hello from WebExtension!");
index.htm (檔名可自定喔)
MainActivity.kt
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="./js/jquery-3.5.1.min.js"></script>
<script type="text/javascript" src="./js/jquery-ui-1.8.16.custom.min.js"></script>
<link rel="stylesheet" href="./css/jquery-ui-1.8.16.custom.css">
<style>
img{ max-width:50%; }
.matrix-block { font-size: 150%; text-align: center }
mtable.thin-column-padding > mtr > mtd,
fmath span.thin-column-padding > table > tbody > tr > td
{ padding: 0 0.11em !important }
</style>
</head>
<body>
hello
</body>
</html>
...
...
import org.mozilla.geckoview.GeckoRuntime;
import org.mozilla.geckoview.GeckoSession;
import org.mozilla.geckoview.GeckoView;
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var view:GeckoView = findViewById(R.id.geckoview)
val session = GeckoSession()
val runtime = GeckoRuntime.create(this)
session.contentDelegate = object : ContentDelegate {}
if(runtime==null) {
runtime = GeckoRuntime.create(this)
}
session.open(runtime)
view.setSession(session)
session.loadUri(""resource://android/assets/index.htm"") // 先載入首頁,讓 GeckoView 記住相關的設定
// 再載入自定的網頁內容
}
}
相關筆記 ----

沒有留言:
張貼留言