Delphi or C++Builder で Android 上にインストールされているアプリケーションの一覧を取得する


この記事は以前 EDN の Delphi, C++Builder に投稿した記事のリライトです。

他のアプリと連携するようなアプリを作ろうとしたとき、実際にその端末に何のアプリがインストールされているかを調べなければ話が始まりません。
連携したいアプリがインストールされていないことも考えられますから。

Delphi や C++Builder から Android API の PackageManagerApplicationInfo を使うと、デバイスにインストールされているアプリケーションの情報を取得することができます。

サンプルコード

フォーム上に TToolBar とその上に TButton を置き、残りの場所は TListBox を Align = Client で設置しています。
ボタンをクリックすると、取得したアプリ名を Listbox の Items として追加して表示します。
(10.2 Tokyo Release 1, Nexus 5, Android 5.1.1 で確認してます)

Delphi

procedure TForm1.Button1Click(Sender: TObject);
// usesに以下を追加します
// Androidapi.JNI.GraphicsContentViewText
// Androidapi.JNI.JavaTypes
// Androidapi.Helpers
// Androidapi.JNIBridge

var
  PM: JPackageManager;  // PackageManager
  PL: JLlist;           // 取得したパッケージ情報を格納するためのリスト
  AI: JApplicationInfo; // ApplicationInfo
  iter: JIterator;
  i: Integer;
begin
// PackageManagerを取得する
  PM := TAndroidHelper.Activity.getPackageManager;

// JListにパッケージ情報を格納する
  PL: PM.getInstalledApplications(TJContext.JavaClass.BIND_AUTO_CREATE); 
  iter := PL.Iterator;

// 初期化
  i := 0;
  ListBox1.Items.Clear;

  while iter.hasNext do begin
    // リストに格納されているパッケージ情報を1件取り出す
    AI := TJApplicationInfo.Wrap((PL.get(i) as ILocalObject).GetObjectID);

    // ListBoxの itemsに loadLabelで取得したアプリケーション名をセットする
    ListBox1.Items.Add(JStringtoString(AI.loadLabel(PM).toString));

    // 次の項目へ
    i := i+1;
    iter.next;
  end;
end;

C++Builder

void __fastcall TForm1::Button1Click(TObject *Sender)
{
// include に以下を追加します
// Androidapi.JNI.GraphicsContentViewText.hpp
// Androidapi.JNI.JavaTypes.hpp
// Androidapi.Helpers.hpp
// Androidapi.JNIBridge.hpp

  _di_JPackageManager PM;  // PackageManager
  _di_JList PL;            // 取得したパッケージ情報を格納するためのリスト
  _di_JApplicationInfo AI; // ApplicationInfo
  _di_JIterator iter;

// PackageManagerを取得する
  PM = TAndroidHelper::Activity->getPackageManager();

// JListにパッケージ情報を格納する
  PL = PM->getInstalledApplications(TJContext::JavaClass->BIND_AUTO_CREATE);
  iter = PL->iterator();

// 初期化
  int i=0;
  ListBox1->Items->Clear();

  while (iter->hasNext()) {
    // リストに格納されているパッケージ情報を1件取り出す
    AI = TJApplicationInfo::Wrap(_di_ILocalObject(PL->get(i))->GetObjectID());

    // ListBoxの itemsに loadLabelで取得したアプリケーション名をセットする
    ListBox1->Items->Add(JStringToString(AI->loadLabel(PM)->toString()));

    //次の項目へ
    i++;
    iter->next();
  }
}