【问题标题】:Open file manage and get selected file打开文件管理并获取选定的文件
【发布时间】:2015-09-04 22:13:22
【问题描述】:

使用 Delphi XE 8 并构建 Android 应用程序,我可以通过打开设备上安装的某个文件管理器应用程序来浏览设备中的文件,然后取回所选的文件名和路径吗?

【问题讨论】:

  • 那么,“某个文件管理器应用”是否允许您这样做?
  • 尝试通过 Androidapi.JNI*.pas 使用本机意图(不确定您需要什么)。您应该遵循学习如何在 FMX 中使用意图的路径。例如,参见 FMX.PhoneDialer.Android.pas 中的 TAndroidPhoneDialerService.Call。此外,您不仅需要用于意图的 startActivity 方法,还需要 startActivityForResult (native example) 来获得结果。不幸的是,我不确定如何将处理程序传递给所选的应用程序..
  • @SergeyKrasilnikov 的意图是什么?请给我一本书,让我从亚马逊阅读关于意图和 startActivityForResult 的书
  • 对不起,我一个都不认识。好吧,通常没有比文档更好的了:intetnts, startActivityForResult

标签: android delphi firemonkey


【解决方案1】:
unit ufmSelect;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls, FMX.Edit, FMX.Layouts, FMX.ListBox, FMX.Controls.Presentation;

type
  TCallback = procedure (ASelected: String) of object;

  TfmSelect = class(TForm)
    Panel1: TPanel;
    btnRefresh: TButton;
    lstItems: TListBox;
    edtCurrentFolder: TEdit;
    pnlDirectoryNotExist: TPanel;
    lblDirectoryNotExist: TLabel;
    btnSelect: TButton;
    procedure btnRefreshClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure lstItemsClick(Sender: TObject);
    procedure btnSelectClick(Sender: TObject);
  private
    { Private declarations }
  public
    const
      CONST_STRING_PARENT = '..';
      CONST_X = '/'; { I know is function for this }

    var
      Callback: TCallback;

    { Public declarations }
    function CD(AFolder: String): Boolean;
  end;

var
  fmSelect: TfmSelect;

implementation

{$R *.fmx}

uses
  System.IOUtils;

procedure TfmSelect.btnSelectClick(Sender: TObject);
var
  LResult: String;
begin
  if Assigned(Callback) then
    begin
      if lstItems.ItemIndex = -1 then
        LResult := EmptyStr
      else
        LResult := lstItems.Items[lstItems.ItemIndex];

      Callback(LResult);
    end;

  Close;
end;

function TfmSelect.CD(AFolder: String): Boolean;
var
  LParent: String;
  LDirs,
  LFiles: TStringDynArray;
  s: String;
begin
  lstItems.Clear;
  pnlDirectoryNotExist.Visible := False;
  if (AFolder <> EmptyStr) and (AFolder <> CONST_X) and (AFolder[AFolder.Length - 1] <> CONST_X) then
    AFolder := AFolder + CONST_X;
  edtCurrentFolder.Text := AFolder;

  { http://stackoverflow.com/questions/20318875/how-to-show-the-availble-files-in-android-memory-with-firemonkey }
  if not TDirectory.Exists(AFolder, True) then
    begin
      lblDirectoryNotExist.Text := 'Directory ' + AFolder + ' does not exist.';
      pnlDirectoryNotExist.Visible := True;
      Exit(False);
    end;

  { }
  LParent := TDirectory.GetParent(AFolder);

  { }
  if LParent <> AFolder then
    lstItems.Items.Add(CONST_STRING_PARENT);

  { }
  LDirs := TDirectory.GetDirectories(AFolder, '*');

  // Get all files. Non-Windows systems don't typically care about
  // extensions, so we just use a single '*' as a mask.
  LFiles := TDirectory.GetFiles(AFolder, '*');

  for s in LDirs do
    lstItems.Items.Add(s + CONST_X);

  for s in LFiles do
    lstItems.Items.Add(s);

  Result := True;
end;

procedure TfmSelect.FormCreate(Sender: TObject);
begin
  pnlDirectoryNotExist.Visible := False;
end;

procedure TfmSelect.lstItemsClick(Sender: TObject);
var
  s: String;
begin
  if lstItems.ItemIndex = -1 then
    Exit;

  if SameText(lstItems.Items[lstItems.ItemIndex], CONST_STRING_PARENT) then
    { Or we need to  use global var for Parent }
    CD(TDirectory.GetParent(edtCurrentFolder.Text))
  else
    begin
      s := lstItems.Items[lstItems.ItemIndex];

      if s = EmptyStr then
        Exit;

      if s[s.Length - 1] = CONST_X then
        CD(s);
    end;
end;

procedure TfmSelect.btnRefreshClick(Sender: TObject);
begin
  if edtCurrentFolder.Text <> EmptyStr then
    CD(edtCurrentFolder.Text)
  else
    CD(TPath.GetDocumentsPath);
end;

end.

使用示例

  if fmSelect = nil then
    begin
      Application.CreateForm(TfmSelect, fmSelect);
      fmSelect.Callback := Yahoo;
    end;
  fmSelect.Show;
  fmSelect.CD(TPath.GetDocumentsPath);


procedure TFormXX.Yahoo(ASelectedItem: String);
begin
  ShowMessage(ASelectedItem);
  //
end;

【讨论】:

    【解决方案2】:

    你可以使用 JFileDialog

    查看以下链接

    http://bluexmas.tistory.com/427

    【讨论】:

    • 我对这个问题的解读是提问者想要使用特定的外部应用程序
    • @DavidHeffernan 提问者想要使用特定的外部应用程序,因为 Delphi TOpenDialog 仅支持 Win32/64 和 OS X,我的想法是这样。
    • 也许您可以在答案中添加说明性文字
    • 有什么参考书或书吗?虽然这是我需要的,但我无法理解代码............谢谢
    • @DavidHeffernan 我做了“我自己的”为 FMX 选择文件/文件夹对话框 :)
    猜你喜欢
    • 2014-06-25
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 2016-08-06
    相关资源
    最近更新 更多