今回のエンジニアブログを担当致します、佐藤です。
前回のエンジニアブログ(ライブ壁紙でステータスバーの通知を受け取る)でライブ壁紙でステータスバーの通知を受け取らせてみました。
これはステータスバーに表示されたアプリのパッケージ名を取得するというものでしたので、
今回はパッケージ名からアプリ名を取得する機能を追加していこうと思います。
◆◇やりたいことの大まかな手順◇◆
- 端末にインストールされているアプリのパッケージ名とアプリ名を取得し保存する
- ステータスバーの通知を取得
- 通知があったアプリのパッケージ名をキーにアプリ名を取得
1.端末にインストールされているアプリのパッケージ名とアプリ名を取得しHashMapで保存する
PackageManagerとApplicationInfoを使用しアプリの一覧を取得します。
データの保存にはHashMapを使ったDataMapクラスを使用します。
LiveWall.java
PackageManager pm = getPackageManager();
List<ApplicationInfo> list = pm.getInstalledApplications(0);
インストールされているアプリを一つずつKey(パッケージ名)とValue(アプリ名)にしてHashMapに保存していきます。
String[] apps = new String[ list.size() + 1 ]; HashMap<String, String> appKeyValue = new HashMap<String, String>(); int i = 0; for (ApplicationInfo ai : list) { apps[i++] = ai.packageName; appKeyValue.put(ai.packageName, ai.loadLabel(pm).toString()); } datamap.WriteKeyValues(appKeyValue); installPackages = apps;
これで、パッケージ名をKeyにアプリ名を呼び出せるようになりました!
2.ステータスバーの通知を取得
ステータスバーの通知を取得するのにはAccessibilityServiceを継承したクラスが必要になります。
前回のブログでも紹介しましたが、通知を取得したときの処理を今回は以下のようにしました。
GetStatusBar.java
switch (eventType) { case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED: HashMap<String, String> hs = new HashMap<String, String>(); // 通知があった hs.put("isDataset", event.getPackageName().toString()); datamap.WriteKeyValues(hs); break; }
この時、直接アプリ名を取得できないかなと思いましたが、パッケージ名を取得することはできてもアプリ名の取得はできませんでした。
ここで通知があったアプリのパッケージ名を保存しました。
3.通知があったアプリのパッケージ名をキーにアプリ名を取得
最後に先ほど保存した通知があったアプリのパッケージ名をキーにアプリ名を呼び出します。
LiveWall.java
public String findApps (String packeageName){ HashMap<String, String> apps = datamap.ReadKeyValues(installPackages); return apps.get(packeageName); }
パッケージ名からアプリ名を取得するのに、最初はものすごく難しく考えてしまって
ブログを書くまでに遠回りをしてしまいましたが、結果として自分の経験値になったかなと思いました!