http://www.cnblogs.com/m0488/p/7763063.html
相关资料:群号383675978
unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.Edit, Androidapi.JNI.JavaTypes,//JString使用 Androidapi.JNI.GraphicsContentViewText,//JIntent使用 FMX.Surfaces,//TBitmapSurface使用 Androidapi.Helpers,//SharedActivity使用 System.IOUtils,//TPath使用 Androidapi.JNIBridge,//ILocalObject使用 FMX.Helpers.Android,//JBitmapToSurface使用 System.Generics.Collections,//TList使用 FMX.ListView.Types, FMX.ListView.Appearances, FMX.ListView.Adapters.Base, FMX.ListView, FMX.StdCtrls, FMX.ScrollBox, FMX.Memo; type TForm1 = class(TForm) Edit1: TEdit; ListView1: TListView; Button1: TButton; Memo1: TMemo; procedure Edit1Change(Sender: TObject); procedure Edit1Typing(Sender: TObject); procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure ListView1ItemClick(const Sender: TObject; const AItem: TListViewItem); private { Private declarations } MainList : TList<JActivityInfo>; dictAppIcons : TDictionary<Integer, TBitmap>; //过虑方法 procedure FilterListView(AListView: TListView; AFilterName: string); //打开APP方法 procedure OpenApp(PackageName, AppName : JString); //获取安装的APP function GetActivityAppList: JList; function GetOrSetCashAppIcon(appInfo: JApplicationInfo): TBitmap; procedure LoadActivityInfoList(var List: TList<JActivityInfo>); procedure LoadDictonaryAppIcons(index: Integer; appInfo: JApplicationInfo; var dictonaryAppIcons: TDictionary<Integer, TBitmap>); procedure LoadListView(listView: TListView; AppList: TList<JActivityInfo>; dictonaryAppIcons: TDictionary<Integer, TBitmap>); procedure LoadListViewBitmap(listView: TListView; AppList: TList<JActivityInfo>; var dictonaryAppIcons: TDictionary<Integer, TBitmap>); public { Public declarations } end; const DEFAUT_INDEX: Integer = -1; var Form1: TForm1; implementation {$R *.fmx} {$R *.NmXhdpiPh.fmx ANDROID} { TForm1 } //调用打开APP procedure TForm1.Button1Click(Sender: TObject); begin OpenApp(StringToJString('com.androidillusion.videocamillusionpro'), StringToJString('com.androidillusion.videocamillusionpro.VideoillusionActivity')); end; //改变事件 procedure TForm1.Edit1Change(Sender: TObject); begin if Edit1.Text = '' then FilterListView(Self.ListView1, Edit1.Text.Trim); end; //输入事件 procedure TForm1.Edit1Typing(Sender: TObject); begin FilterListView(Self.ListView1, Edit1.Text.Trim); end; //过虑方法 procedure TForm1.FilterListView(AListView: TListView; AFilterName: string); var i: integer; item: TListViewItem; lower: string; begin if not Assigned(AListView) then Exit; lower := AFilterName.ToLower.Trim; if lower.IsEmpty then begin if Assigned(AListView.Items.Filter) then AListView.Items.Filter := nil; end else begin AListView.ItemIndex := DEFAUT_INDEX; AListView.Items.Filter := function(sFilter: string): Boolean begin Result := (lower.IsEmpty) or sFilter.ToLower.Contains(lower); end; end; end; procedure TForm1.FormCreate(Sender: TObject); begin LoadActivityInfoList(MainList); LoadListView(Self.ListView1, MainList, self.dictAppIcons); LoadListViewBitmap(Self.ListView1, MainList, self.dictAppIcons); end; //获取安装的APP function TForm1.GetActivityAppList: JList; var tempList: JList; Intent: JIntent; Manager: JPackageManager; begin Intent := TJIntent.Create; Intent.SetAction(TJIntent.JavaClass.ACTION_MAIN); Intent.AddCategory(TJIntent.JavaClass.CATEGORY_LAUNCHER); Manager := SharedActivity.GetPackageManager; tempList := nil; tempList := Manager.QueryIntentActivities(Intent, 0); Result := tempList; end; function TForm1.GetOrSetCashAppIcon(appInfo: JApplicationInfo): TBitmap; var Drawable: JDrawable; Bitmap: JBitmap; itemBitmap: TBitmap; Surface: TBitmapSurface; saveDir: string; pngFileName: string; SaveParams: TBitmapCodecSaveParams; begin if not Assigned(appInfo) then begin Result := itemBitmap; Exit; end; saveDir := TPath.GetCachePath; pngFileName := saveDir + '/' + JStringToString(appInfo.packageName) + '.png'; itemBitmap := TBitmap.Create; if not TDirectory.Exists(saveDir, False) then TDirectory.CreateDirectory(saveDir); if TFile.Exists(pngFileName) then itemBitmap.LoadFromFile(pngFileName) else begin Drawable := appInfo.loadIcon(SharedActivity.getPackageManager); Bitmap := TJBitmapDrawable.Wrap((Drawable as ILocalObject).GetObjectID).getBitmap; Surface := TBitmapSurface.Create; try if JBitmapToSurface(Bitmap, Surface) then begin itemBitmap.Assign(Surface); SaveParams.Quality := 100; itemBitmap.SaveToFile(pngFileName, @SaveParams); end; finally Surface.Free; end; end; Result := itemBitmap; end; procedure TForm1.ListView1ItemClick(const Sender: TObject; const AItem: TListViewItem); begin if not Assigned(MainList) then Exit; OpenApp(MainList.Items[AItem.Tag].applicationInfo.packageName, MainList.Items[AItem.Tag].name); Memo1.Lines.Add(JStringToString(MainList.Items[AItem.Tag].applicationInfo.packageName) + '/\' + JStringToString(MainList.Items[AItem.Tag].name)); end; procedure TForm1.LoadActivityInfoList(var List: TList<JActivityInfo>); var tempList: JList; i: Integer; ResolveInfo: JResolveInfo; Info: JActivityInfo; AppInfo: JApplicationInfo; begin if not Assigned(List) then List := TList<JActivityInfo>.Create; List.Clear; tempList := Self.GetActivityAppList; for i := 0 to tempList.size - 1 do begin ResolveInfo := TJResolveInfo.Wrap((tempList.get(i) as ILocalObject).GetObjectID); Info := TJActivityInfo.Wrap((ResolveInfo.activityInfo as ILocalObject).GetObjectID); AppInfo := TJApplicationInfo.Wrap((Info.applicationInfo as ILocalObject).GetObjectID); List.Add(Info); end; end; procedure TForm1.LoadDictonaryAppIcons(index: Integer; appInfo: JApplicationInfo; var dictonaryAppIcons: TDictionary<Integer, TBitmap>); var itemBitmap : TBitmap; begin if not Assigned(dictonaryAppIcons) then dictonaryAppIcons := TDictionary<Integer, TBitmap>.Create; if not dictonaryAppIcons.ContainsKey(index) then begin itemBitmap := GetOrSetCashAppIcon(appInfo); dictonaryAppIcons.AddOrSetValue(index, itemBitmap); end; end; procedure TForm1.LoadListView(listView: TListView; AppList: TList<JActivityInfo>; dictonaryAppIcons: TDictionary<Integer, TBitmap>); var tempItem : TListViewItem; tempString, tempSubString, tempSubString2 : string; i : integer; begin if (not Assigned(listView)) or (not Assigned(AppList)) then Exit; listView.Items.Clear; listView.BeginUpdate; for I := 0 to AppList.Count - 1 do begin tempString := JStringToString(AppList.Items[i].applicationInfo.loadLabel(SharedActivity.getPackageManager).toString); tempItem := listView.Items.Add; tempItem.Text := tempString; tempItem.Tag := i; end; listView.EndUpdate; end; procedure TForm1.LoadListViewBitmap(listView: TListView; AppList: TList<JActivityInfo>; var dictonaryAppIcons: TDictionary<Integer, TBitmap>); var i: integer; begin if (not Assigned(listView)) or (not Assigned(AppList)) then Exit; listView.BeginUpdate; for I := 0 to listView.ItemCount - 1 do begin listView.Items[i].BeginUpdate; LoadDictonaryAppIcons(i, AppList.Items[listView.Items[i].Tag].applicationInfo, dictonaryAppIcons); if Assigned(dictonaryAppIcons) and (dictonaryAppIcons.ContainsKey(i)) then listView.Items[i].Bitmap := dictonaryAppIcons.Items[i]; listView.Items[i].EndUpdate; Application.ProcessMessages; end; listView.EndUpdate; end; //打开APP方法 procedure TForm1.OpenApp(PackageName, AppName: JString); var Intent : JIntent; NativeComponent : JComponentName; begin Intent := TJIntent.Create; Intent.setAction(TJIntent.JavaClass.ACTION_MAIN); Intent.addCategory(TJIntent.JavaClass.CATEGORY_LAUNCHER); NativeComponent := TJComponentName.JavaClass.init(PackageName, AppName); Intent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK or TJIntent.JavaClass.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); Intent.setComponent(NativeComponent); SharedActivity.startActivity(Intent); end; end.