Search code examples
androiddelphiadb

How to get the result of adb shell command in Embarcadero Delphi


I need to get the list of packages of my Android device using Embarcadero Delphi XE10 Seattle

procedure TDeviceInfoForm.Button1Click(Sender: TObject);
var   stdout:JOutputStream;
      stdin:JInputStream;
      suProcess:JProcess;
begin  
      suProcess:=TJRuntime.JavaClass.getRuntime.exec(StringToJString('pm   list     packages'));
      stdout:=suProcess.getoutputStream;
     stdin:=suProcess.getInputStream;
end;

Solution

  • You are going about this the wrong way. You should not be using ADB at all. Use Android's PackageManager class instead. Its getInstalledPackages() method returns a List of PackageInfo objects, one for each package. Simply loop through that list, eg:

    uses
      ...,
      Androidapi.JNI.JavaTypes,
      Androidapi.JNI.GraphicsContentViewText,
      Androidapi.Helpers;
    
    procedure TDeviceInfoForm.Button1Click(Sender: TObject);
    var
      list: JList;
      iter: JIterator;
      pkg: JPackageInfo;
    begin  
      // read the getInstalledPackages() documentation for details about the available flags...
      list := TAndroidHelper.Context.getPackageManager.getInstalledPackages(0);
      iter := list.iterator;
      while iter.hasNext do
      begin
        pkg := TJPackageInfo.Wrap((iter.next as ILocalObject).GetObjectID);
        // use pkg as needed...
      end;
    end;