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などを参照)。