標籤:

Kivy中文編程指南:KV Android 詳細指南

英文原文

在 Android 設備上,只要是支持 OpenGL ES 2.0 (至少為 Android 2.2 以及其後的版本),就基本都能運行 Kivy 應用程序。OpenGL ES 2.0 基本上是現代設備的標準了;根據谷歌的報道說,至少有 99.9% 的設備都是支持的。

Kivy 的 APK 就是常規的 Android APP,和其他的 APP 一樣可以四處發布,比如谷歌 Play 商店等等。在暫停或者重啟的時候這些應用的行為也都很正常,下面要介紹道的是 Kivy APP 用到的 Android 服務和需要用到的大多數常規的 Java API。

下面的內容依次講解了如何 針對 Android 平台打包 APP, 在設備上調試 APP,以及使用震動或者讀取感測器等等 Android API。

針對 Android 平台打包 APP?

Kivy 項目提供了針對 Android 平台打包 APP 所需的全部必備工具,可以構建單個的 APK 文件發布到谷歌 Play 市場之類的應用商店。詳細內容可以參考針對 Android 打包應用程序的英文原版文檔或者中文翻譯版本:個人博客地址,知乎專欄地址。

在 Android 設備上調試 APP?

通過 Android Logcat 流,可以觀察代碼的常規輸出(比如 stdout,stderr),也可以查看常規的 Kivy 日誌。這需要使用 adb 來查看,adb 包含在 Android SDK 內。這首先就要求你再設備上開啟開發者模式,然後啟用 USB 調試功能來啟用 adb,接著把設備連接到計算機,在終端中運行下面的命令:

adb logcatn

這樣就能看到日誌輸出了,包括標準輸出和出錯信息( stdout/stderr )以及 Kivy 的日誌。

如果你用 Buildozer 打包的 APP,那麼有可能 adb 工具沒有包含在你的 $PATH 環境變數中,這樣上面的命令就可能沒有效果。這時候可以用下面的方法:

buildozer android logcatn

上面這樣就是運行了 Buildozer 伴隨安裝的 adb 工具,或者還可以去$HOME/.buildozer/android/platform 這個目錄找到 Buildozer 伴隨安裝的 SDK。

或者還可以下載Kivy Launcher來運行和調試應用程序。如果用這種方法運行 Kivy 應用程序,可以在你的應用程序所在目錄下找到一個名字為 /.kivy/logs 的子目錄,裡面就是日誌文件。

使用 Android API?

雖然 Kivy 是一個 Python 框架,Kivy 項目也還維護了一套用來調用常規 Java API 的工具,可以用來處理震動、感測器、發送簡訊或郵件等等。

對新用戶來說,推薦閱讀 Plyer。要想有更深入的使用或者調用一些目前沒有封裝的 API,可以直接使用 Pyjnius。Kivy 還內置了一個 Android 模塊 來實現 Android 的一些基礎功能。

在 Kivy wiki 上可以找到用戶提供的 Android 代碼和樣例。

Plyer?

Plyer 是一個 Python 風格的,獨立於平台的 API,用於使用各種平台上都普遍具有的功能,尤其是移動平台。其設計思路是你的應用可以簡單地調用一個 Plyer 函數,例如給用戶一個消息通知,然後 Ply會處理在不同的平台或者操作系統下分別如何把這件事完成。在 Plyer 的內部,在 Android 平台使用的是 Pyjnius,在 iOS 平台使用了 Pyobjus,在桌面平台又用了其他的特定 API。

例如,下面的代碼就會讓你的 Android 設備震動,或者當你在其他平台不恰當地使用的時候就會跑出一個 NotImplementError,例如在桌面平台等沒有對應硬體的情況下:

from plyer import vibratornvibrator.vibrate(10) # vibrate for 10 secondsn

Plyer 支持的 API 越來越多了,可以在 Plyer GitHub 頁面的 README 文件中查看完整的支持列表。

Pyjnius?

Pyjnius 是一個 Python 模塊,它允許你直接在 Python 中讀取 Java 類,自動轉換參數成正確的類型,還允許你把 Java 的運行結果轉換給 Python。

Pyjnius 可以從 它的 GitHub 地址下載獲得,並且有一份詳細的文檔。

下面的代碼是一個簡單的小例子,展示了如何使用 Pyjnius 來讀取常規的 Android 震動 API,就跟上面 Plyer 的代碼效果一樣:

# autoclass 接收一個Java 類,然後打包給 Python;nfrom jnius import autoclassnn# Context 是 Android API 中一個常用的 Java 類;nContext = autoclass(android.content.Context)nn# PythonActivity 是在 python-for-android 內由 Kivy bootstrap app 提供的一個類;nPythonActivity = autoclass(org.renpy.android.PythonActivity)nn# 這裡的 PythonActivity 存儲了一個指向當前運行的 Activity 的引用;n# 我們要用它來讀取 震動服務nactivity = PythonActivity.mActivitynn# 底下的這個振動器代碼和 Java 裡面基本一樣的;nvibrator = activity.getSystemService(Context.VIBRATOR_SERVICE)nnvibrator.vibrate(10000) # 這個值是毫秒為單位,這裡設置的 10 000 毫秒相當於 10 秒。n

上面的代碼直接用了 Java API 函數來調用了振動器,Pyjnius 自動把 API 轉換出給了 Python 代碼使用,而又把我們的調用都回傳給了 Java。相比 Plyer 的實現,這種方法更繁瑣一些,也更像 Java 的風格,在這個例子中沒有什麼優勢。不過 Plyer 也並沒有對 Pyjnius 的所有 API 都進行了封裝。

Pyjnius 還有一個強大的功能就是實現 Java 介面,這在封裝某些 API 的時候非常重要,不過這裡就不詳細講這麼多了,有興趣的話去 Pyjnius 的官方文檔來了解更深層次內容吧。

Android 模塊?

Python-for-android 項目中包含了一個 Python 模塊(實際上是用 cython 封裝的 Java)來讀取一系列有限的 Android API。這個很大程度上已經被上面的 Pyjnius 和 Pyler 取代了,因為後者更加靈活方便,不過有時候可能這個模塊還有些用處。所有可用的文檔都可以在 python-for-android 官方文檔中查閱到。

這其中就包括了計費/應用內購買的代碼,以及創建或者讀取某些 Android 服務的代碼,其他工具目前還沒能提供這方面的功能。

項目狀態以及通過測試的設備?

前面的章節講述了 Kivy 在 Android 系統的構建工具,以及他們各自的缺陷還有就是已知能夠使用的設備。

Android 工具鏈現在挺穩定的,一定程度上基本能適用於各種設備了;Kivy 的最低要求是 OpenGL ES 2.0 以及 Android 2.2。這現在絕對是覆蓋面很廣泛了— Kivy 已經都可以在 Android 智能手錶上面運行了。

當前在技術上存在的一個限制就是 Android 構建工具只能生成 ARM 平台的 APK 文件,這些文件不能運行於 X86 處理器的 Android 設備上,好在目前 這類 X86 的 Android 設備還不是主流。不過對 X86 處理器的 Android 設備的支持是後續要添加的。

因為目前 Kivy 基本上能在絕大多數 Android 設備上面良好運行了,所以之前的那個設備支持列表就關榮退休了—只要滿足上面的要求的 Android 設備,基本就都能夠使用。


推薦閱讀:

Python GUI教程(七):轉換qt設計師的ui代碼為Python代碼
如何踏上人工智慧之路(機器學習篇)
python如何查看某一個包中的某一個函數的使用方法?
Flask文件上傳(三):完整實現
特徵工程總結:R與Python的比較實現

TAG:Python | Kivy |