原本 CBETA 有一個很簡單的 Android APP,就是用 WebView 元件開啟 CBETA 網站,就像一個隱藏版的瀏覽器。
不過從 Android 9(API級別28)開始,WebView 默認情況下已停用明文支持,所以程式勢必要修改。於是用 Android Studio + Kotlin 做了一個簡單的版本,同時也處理了明文不支持的問題。
1.開啟新專案
底下用 Java 版測試,程式的部份也有 Kotlin 的版本,其他都一樣。
在 Android Studio 之中開啟一個新專案,選擇 Empty Activity
開啟專案後,會看到如下結構,紅色是要修改的檔案,藍色最底下會提到。
- AndroidManifest.xml
- activity_main.xml
- MainActivity.java
- style.xml
2.加入網路權限
在 AndroidManifest.xml 加入藍色這行,以開啟網路權限。
<uses-permission android:name="android.permission.INTERNET" />
3.修改 Layout
開啟 activity_main.xml,全部清掉,只放上 Webview 物件,XML 如下。
我有試過在原始的內容下加入 WebView,結果失敗,所以依網路上的教學,全部都清掉。
<?xml version="1.0" encoding="utf-8"?>
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
4.修改主程式
修改 MainActivity.java 檔案,底下藍色是自行加上去的。
package org.cbeta;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebSettings;
import android.webkit.WebViewClient;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView webview = (WebView) findViewById(R.id.webview);
WebSettings webSettings = webview.getSettings();
webSettings.setJavaScriptEnabled(true);
setContentView(webview);
webview.setWebViewClient(new WebViewClient());
webview.loadUrl("http://tripitaka.cbeta.org/mobi/");
}
}
Kotlin 版程式如下
package org.heavenchou.cbeta
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.webkit.WebView
import android.webkit.WebSettings
import android.webkit.WebViewClient
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val webview = findViewById(R.id.webview) as WebView
val webSettings = webview.settings
webSettings.javaScriptEnabled = true
setContentView(webview)
webview.webViewClient = WebViewClient()
webview.loadUrl("http://tripitaka.cbeta.org/mobile/")
}
}
5.移除標題欄
style.xml 修改藍色的部份,設定為 NoActionBar,可以移除標題欄。
<resources>
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
</resources>
6.測試結果
在 Samsung SM-N900 (Android 5.0, API 21) 測試 OK
在虛擬機 Nexus 5X API 82 x86 失敗
主要錯誤是 ERR_CLEARTEXT_NOT_PERMITTED
主要原因是從 Android 9(API級別28)開始,默認情況下禁用明文支持。
網路上有人教導在 AndroidManifest.xml 要加上
android:usesCleartextTraffic="true"
但實際測試無效,這可能是在 Android 8 和之前的版本有效。
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application
...
android:usesCleartextTraffic="true"
...>
...
</application>
</manifest>
目前已知解法有二:
1. 採用 https 安全協議即可。
2. 有人教導指定特定來源使用明文。
a. 創建文件 res/xml/network_security_config.xml
<?xml version="1.0" encoding="utf-8"?> <network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">Your URL</domain>
</domain-config>
</network-security-config>
因為主要網頁內有 code.jquery.com , 所以我加了這二行
<domain includeSubdomains="true">tripitaka.cbeta.org</domain>
<domain includeSubdomains="true">code.jquery.com</domain>
b. 在 AndroidManifest.xml 加上
android:networkSecurityConfig="@xml/network_security_config"
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application
...
android:networkSecurityConfig="@xml/network_security_config"
...>
...
</application>
</manifest>
結果如下:
- 瀏覽次數:15739
發表新回應