Androidアプリを一覧表示 - Kivy Advent Calendar 2013


本当はアプリ起動まで持って行きたかったんですけどねー。ちょっと時間的に無茶でした…
現状はAndroidアプリの一覧を表示するだけです。まあソートしてないので、起動できたところで使いづらいったらありゃしませんが…
しかしAndroidのパッケージマネージャからデータを引っ張り出してますが、パーミッション要らないんですね。トロイの木馬には怪しいアプリが丸見えなのか…おお怖い怖い。
まあListViewの使い方の学習も兼ねていますので、その部分だけはAndroid以外の人も参考になるかと。
 


(/sdcard/kivy/launch/)

android.txt お約束
fonts_ja.py 使い回し
main.py スクリプト本体

(main.py)

from kivy.app import App
from kivy.uix.listview import ListView, ListItemLabel
from kivy.adapters.listadapter import ListAdapter
from jnius import autoclass, cast
import fonts_ja

class PackageManager:

    PythonActivity = autoclass('org.renpy.android.PythonActivity')
    Intent = autoclass('android.content.Intent')

    def __init__(self):
        self.context = cast('android.content.Context', self.PythonActivity.mActivity)
        self.pm = self.context.getPackageManager()

    def query(self):
        intent = self.Intent()
        intent.setAction(self.Intent.ACTION_MAIN)
        intent.addCategory(self.Intent.CATEGORY_LAUNCHER)
        return self.pm.queryIntentActivities(intent, 0).toArray()

    def loadLabel(self, ri):
        return ri.loadLabel(self.pm).toString()

class LauncherApp(App):

    def build(self):
        pm = PackageManager()
        data = pm.query()
        args_converter = lambda _i, _r: {'text': pm.loadLabel(_r), 'size_hint_y': None, 'height': 50}
        list_adapter = ListAdapter(data=data,
                                   args_converter=args_converter,
                                   cls=ListItemLabel,
                                   selection_mode='single',
                                   allow_empty_selection=False)
        root = ListView(adapter=list_adapter)
        return root

if __name__ == '__main__':
    LauncherApp().run()