Haruyuki Mohri

毛利春幸のブログです。

Android インストールアプリケーション一覧取得

C++Builder FireMonkeyAndroidアプリ一覧取得方法

元ネタ

edn.embarcadero.com

_di_JPackageManager

_di_JPackageManagergetInstalledApplications()で取得したデータは
_di_JListリストに入る_di_JApplicationInfo取得後
アプリ名をstd::queue<String>に保存
そのqueueに入ったデータをListViewに追加
f:id:mojeld:20170819201533p:plain

include

#include <Androidapi.JNI.GraphicsContentViewText.hpp>
#include <Androidapi.JNI.JavaTypes.hpp>
#include <Androidapi.Helpers.hpp>
#include <Androidapi.JNIBridge.hpp>
#include <mutex>
#include <queue>

上記のインクルード必要

コード

画面デザインは、TButtonTListView, TAniIndicator,TTimer

ボタンクリック

void __fastcall TForm1::str_queue(String ls_)
{
    std::lock_guard<std::mutex> lk(f_mx_);
    f_queue.push(ls_);
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    ListView1->Items->Clear();
    Button1->Enabled    = false;
    AniIndicator1->Visible  = true;
    AniIndicator1->Enabled  = true;
    _di_JPackageManager pkg_ = TAndroidHelper::Activity->getPackageManager();
    TThread::CreateAnonymousThread([this, pkg_](){
        _di_JList list_ = pkg_->getInstalledApplications(TJContext::JavaClass->BIND_AUTO_CREATE);
        _di_JIterator iter = list_->iterator();
        int li{0};
        while (iter->hasNext()) {
            _di_JApplicationInfo ai_ = TJApplicationInfo::Wrap(_di_ILocalObject(list_->get(li))->GetObjectID());

            str_queue(JStringToString(ai_->loadLabel(pkg_)->toString()));

            ++li;
            iter->next();
        }
        TThread::Synchronize(TThread::CurrentThread, [this](){
            Button1->Enabled    = true;
            AniIndicator1->Visible  = false;
            AniIndicator1->Enabled  = false;
        });
    })->Start();

}

タイマーイベントからListView1に追加

void __fastcall TForm1::queue_str()
{
    TThread::CreateAnonymousThread([this]()
    {
        std::lock_guard<std::mutex> lk(f_mx_);
        if (!f_queue.empty())
        {
            String s_ = f_queue.front();
            f_queue.pop();
            TThread::Synchronize(TThread::CurrentThread, [this, s_](){
                auto item_ = ListView1->Items->Add();
                item_->Text = s_;
            });
        }
    })->Start();
}
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    queue_str();
}

結果

f:id:mojeld:20170819202337g:plain