LoginSignup
4
2

More than 5 years have passed since last update.

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

Posted at

この記事は以前 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();
  }
}
4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2