Androidでの作業¶
このページではAndroid APIへのアクセスとAndroidでの他のやり取りの管理について詳しく説明しています
Android APIへのアクセス¶
Androidアプリケーションを作成するときは、アプリケーションの外観(全画面、向きなど)を制御したり、他のアプリケーションとやりとりしたり、振動やセンサーなどのハードウェアを使用したりするために、通常のAndroid Java APIにアクセスできます。
自動的にJavaをラッパーしてPythonコードから呼び出し可能にするため、Pythonライブラリの `Pyjnius <http://pyjnius.readthedocs.org/en/latest/>`_を利用できます。 Pyjniusは非常に使いやすいですがとてもPythonicではなくJavaの冗長性を継承しています。この理由から、KivyオーガナイゼーションはPlyerを作成しました。Plyerは特定のAPIをPythonとクロスプラットフォームの方法でさらにラップしています。 Pythonで同じコードを呼び出しできますがAndroid以外のプラットフォームでも同じことをする必要があります。
PyjniusとPlyerはドキュメントが外部リンクされた独立プロジェクトです。以下に簡単な紹介の例とこれらのモジュールをAPKに組み込む方法の説明を参照してください。
このページには、p4aに含めることができるAndroidモジュールも記載されていますが、これは主にPyjniusに置き換えられるので新しいアプリケーションでの使用はお勧めしません。
Pyjniusを使う¶
PyjniusはAndroid APIをPythonから直接呼び出せます。Pyjniusは動的にJavaクラスをラッパーして動作するため、特定の機能が事前にサポートされるまで待つ必要はありません
pyjniusをビルド要件に追加することでPyjniusをAPKに含められます。 --requirements=flask,pyjnius
。これはKivyを含むAPKに自動的に含まれます。その場合は手動で指定する必要はありません。
Pyjniusの基本的なメカニズムは autoclass コマンドで、Javaクラスをラップします。たとえば、あなたのデバイスをバイブレーションさせるコードは次のとおりです:
from jnius import autoclass
# We need a reference to the Java activity running the current
# application, this reference is stored automatically by
# Kivy's PythonActivity bootstrap
# This one works with Pygame
# PythonActivity = autoclass('org.renpy.android.PythonActivity')
# This one works with SDL2
PythonActivity = autoclass('org.kivy.android.PythonActivity')
activity = PythonActivity.mActivity
Context = autoclass('android.content.Context')
vibrator = activity.getSystemService(Context.VIBRATOR_SERVICE)
vibrator.vibrate(10000) # the argument is in milliseconds
ここで注意すべき事項は以下のとおり:
ラッパーする必要のあるクラスはブートストラップによって異なります。これは、PyjniusがブートストラップのJavaソースコードを使用して現在のアクティビティへの参照を取得しているためです.PygameとSDL2の両方のブートストラップがmActivity静的変数に格納されています。 この違いは必ずしも重要ではありませんが、知ることは重要です。
このコードはJava APIに厳密に準拠しています。-Javaコードから同じことを実現するために使用する関数呼び出しとまったく同じです
非常に冗長です -単純なバイブレーションを実現するには行が多いです!
Pyjniusの長所と短所の両方を強調しています。 PythonコードからJavaクラスを作成する場合は構文が少し複雑になることがありますが、これはPythonのコードではなくて短くないです。 これらは以下で説明するPlyerが対処しようとしている問題です。
Pyjniusのドキュメント で詳細を確認することができます。
Plyerを使う¶
Plyerはプラットフォーム固有のAPIに対してあまり冗長ではないPythonicラッパーを提供します。 plyerは作業中ですべてのプラットフォームでPlyerのすべての呼び出しをまだサポートしているわけではありませんが、AndroidとiOSおよびデスクトップオペレーティングシステムをサポートしています
PlyerはまだすべてのAPIをサポートしていませんが、Pyjniusは常に欠落しているものを呼び出せます。
You can include Plyer in your APKs by adding the Plyer recipe to
your build requirements, e.g. --requirements=plyer
.
サポートされているすべてのファサード(プラットフォームAPI)の詳細については、Plyerのドキュメント をチェックする必要がありますが、例として上のPyjniusのセクションで説明したように、バイブレーション機能をどのように実現するするかを示します:
from plyer.vibrator import vibrate
vibrate(10) # in Plyer, the argument is in seconds
これは明らかにPyjniusよりもはるかに簡潔です!
android
の使用¶
Cythonモジュールは、Kivyの古いインターフェースとのAndroid APIのやりとりに使用されていましたがほとんどがPyjniusに置き換えられました。
android
のPythonモジュールは、requirementsに追加する(例: --requirements=kivy,android
)ことで組み込めます。あなたが古い(Pygameの)ブートストラップを使用しない限り、それはKivyによって自動的に組み込まれません
このモジュールは個別に文書化されていません。 Github でソースを読めます。
このモジュールの便利な機能の1つは、 webbrowser.open()
をAndroid上で動作させることです。 次のコードでandroidドモジュールを使用せずにこのエフェクトを複製できます:
from jnius import autoclass
def open_url(url):
Intent = autoclass('android.content.Intent')
Uri = autoclass('android.net.Uri')
browserIntent = Intent()
browserIntent.setAction(Intent.ACTION_VIEW)
browserIntent.setData(Uri.parse(url))
currentActivity = cast('android.app.Activity', mActivity)
currentActivity.startActivity(browserIntent)
class AndroidBrowser(object):
def open(self, url, new=0, autoraise=True):
open_url(url)
def open_new(self, url):
open_url(url)
def open_new_tab(self, url):
open_url(url)
import webbrowser
webbrowser.register('android', AndroidBrowser, None, -1)
Appライフサイクルの使用¶
スプラッシュ画面を閉じる¶
SDL2のブートストラップでは、アプリケーションが正常に起動したかどうかをチェックする方法の制限により、アプリの読み込みが終了して直ちにアプリのスプラッシュ画面が解除されないことがあります。 この場合スプラッシュ画面はアプリケーションGUIと短時間オーバーラップします。
次のようにスプラッシュ画面を閉じられます。 このコードをあなたのアプリケーションビルドメソッドから実行するか、 kivy.clock.Clock.schedule_once
を使って次のフレームで実行します:
from jnius import autoclass
activity = autoclass('org.kivy.android.PythonActivity').mActivity
activity.removeLoadingScreen()
この問題は、別のスプラッシュスクリーンメソッドを使用するため、Pygameブートストラップには影響しません。
戻るボタンの操作¶
Android搭載端末には常にバックボタンがあり、ユーザーは適切なアプリ内機能の実行を望んでいます。 バックボタンをあなたが扱わなければ、Kivyアプリは実際にシャットダウンがクラッシュしたように見えます。
SDL2ブートストラップでは、戻るボタンがエスケープキー(キーコード27、コードポイント270)として表示されます。 このキーを押すとアクションを実行できます。
たとえば、KivyのAppクラスでは次のようになります:
from kivy.core.window import Window
class YourApp(App):
def build(self):
Window.bind(on_keyboard=self.key_input)
return Widget() # your root widget here as normal
def key_input(self, window, key, scancode, codepoint, modifier):
if key == 27:
return True # override the default behaviour
else: # the key now does nothing
return False
アプリを一時停止する¶
ユーザーがアプリケーションを終了すると自動的にAndroidによって一時停止されますが、必要に応じてデータなどの保存に数秒かかる場合があります。 一時停止してあなたのアプリは再び実行されますさいにデータの保証はありません
Kivyを使用してAppクラスに on_pause
メソッドを追加します。これはTrueを返します:
def on_pause(self):
return True
webviewのブートストラップでは、一時停止は自動的に動作するはずです。
SDL2では、appropriate events を処理できます(SDL_APP_WILLENTERBACKGROUNDなどを参照)。