• 0
hryasch

android Выбор файла через диалог

Вопрос

Добрый вечер. У меня такая проблема - мне нужно, чтобы Android приложение по нажатию на кнопку (к примеру) выдавало диалог, где будет видна файловая система (или спрашивала другое доступное приложение, типо X-PLORE), чтобы я мог выбрать файл ( фотографию к примеру) и нажав "окей" чтобы путь запомнился в какую-нибудь переменную.
 

68747470733a2f2f7261772e6769746875622e636f6d2f695061756c50726f2f6146696c6543686f6f7365722f6d61737465722f73637265656e73686f742d312e706e67.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

1 ответ на этот вопрос

  • 0

 

На мобильных платформах обычно не принято указывать пути, хотя есть конечно исключения.
На Android нет стандартного диалога, на iOS есть, но Apple не рекомендует использовать его. 

Important: An iOS app should never use an Open or Save panel to prompt the 
user for the location of a file within the app’s sandbox. iOS apps should 
always save files to known locations inside their sandbox, and apps should 
use a custom interface when presenting those documents to the user. iOS apps 
can, however, use a UIDocumentPickerViewController to prompt the user to 
import, export, open, or move files to or from some areas outside the app’s 
sandbox. For more information, see the Document Picker Programming Guide.

https://developer.apple.com/library/ios/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/UsingtheOpenandSavePanels/UsingtheOpenandSavePanels.html
 

unit frmSelect;

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;
Изменено пользователем ENRGY
Равиль Зарипов (ZuBy) и Rusland понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Похожие публикации

    • Автор: Rusland
      Приложение свернуто или закрыто.
      Отправляю один пуш, на телефоне в шторке появляется уведомление.
      Отправляю еще один, появляется второе уведомление и так далее. Сколько пушей, столько и уведомлений.
      Как сделать чтобы все уведомления собирались в одном уведомлении в шторке? (как делают telegram, whatsapp и т. п.)
    • Автор: Astghik
      How to print text from Android (IOS) device ? (C++ Rad Studio 10.2)
      With USB printer and other types printers (WiFi, Bluetooth ....)
    • Автор: Rionn
      В этой ссылке показан пример работы в одной сети (написано курсивом). Не могу найти, чтобы PC работал по сети или по WiFi, а телефон по мобильным данным. Не подскажете?
    • Автор: Евгений Корепов
      Наткнулся тут на изящную штуку для приложения с PUSH уведомлениями на Android и Ios. Один объект, все сам делает.
      Внедрил в одно боевое приложение с 100+ тысячами установок, полет нормальный.
      Описание тут https://delphiworlds.com/2017/04/firebase-cloud-messaging-android-ios/
      Исходный код с примером на гитхабе https://github.com/DelphiWorlds/PushClient
      Использование максимально простое:
      uses DW.PushClient; .... private FPushClient: TPushClient; procedure PushClientChangeHandler(Sender: TObject; AChange: TPushService.TChanges); procedure PushClientReceiveNotificationHandler(Sender: TObject; const ANotification: TPushServiceNotification); .... procedure TFormMain.InitPushService; begin FPushClient := TPushClient.Create; FPushClient.GCMAppID := ConstGCMAppID; FPushClient.ServerKey := ''; FPushClient.BundleID := ''; FPushClient.UseSandbox := Debug; // Change this to False for production use! FPushClient.OnChange := PushClientChangeHandler; FPushClient.OnReceiveNotification := PushClientReceiveNotificationHandler; try FPushClient.Active := True; except SendError('FPushClient.Active Exception'); end; end; procedure TFormMain.PushClientChangeHandler(Sender: TObject; AChange: TPushService.TChanges); begin if TPushService.TChange.DeviceToken in AChange then begin HDevicePushParams.DeviceID:=FPushClient.DeviceID; HDevicePushParams.DeviceToken:=FPushClient.DeviceToken; GetHTTP(CommandRegisterFCM); // Memo1.Lines.Add('DeviceID = ' + FPushClient.DeviceID); // Memo1.Lines.Add('DeviceToken = ' + FPushClient.DeviceToken); end; end; procedure TFormMain.PushClientReceiveNotificationHandler(Sender: TObject; const ANotification: TPushServiceNotification); begin // ShowMessage(ANotification.DataObject.ToString... end; Правда руки не дошли разобраться для чего ему 
        FPushClient.ServerKey := '';
        FPushClient.BundleID := '';
      Но и без этого работает.
       
    • Автор: Golovanyuk
      Здравствуйте!
      У меня проблемы при создании Android программ.
      Когда компилирую проект и запускаю его из среды Delphi сразу на мобильник, то первый раз программа еще работает, а во второй-третий раз на мобильнике показывается только заставка с огнем, а потом черный экран, а в самой среде в самом низу (где Event log и где обычно показываются процессы) - ничего нет, пусто.
      Потом приходится перезапускать Delphi.
      У меня есть подозрения, что я неправильно настроил Delphi.
      Не могли бы гуру взглянуть на мои настройки и указать на мои ошибки?
      Скриншоты приложил, спасибо.
      P,S, Delphi 10.1



    • Автор: delphiex
      Всем доброго дня. Прошу помочь, любая малейшая подсказка прояснит ситуацию. Сделал русскоязычное Андроид приложение на Delphi XE8.  Использовал SQlite в своем проекте. Работает отлично, оттестировал на Android 6.0 и  Android 4.5 на двух разных аппаратах. Прежде чем делать мультиязычное приложение, решил проверить как оно будет работать, если язык системы будет отличным от русского. Поставил английский-United Kingdom и приложение не запустилось, вернее пошла заставка, после нее  приложение просто закрылось без ошибок. То же самое при французском, испанском системных языках. А вот при немецком и украинском языке системы - работает. В чем здесь дело никак не могу понять и куда копать. Приложение не могу предоставить - слишком большое.
    • Автор: Алмаз Амангельды
      Multi device application 
      Работаю  с WebBrowser и появляется такая проблема что компонент дублируется появляется тоненькая полоска (пикселей 10 или 5 ) которая работает отдельно (т.е можно скролить страницу в разные направления ,  поэтому складывается впечатление что данный компонент Дублируется )
      Вверху tabcontrol к нему добавлен Эффект shadow внизу
      twebBrowser  Align =Client 
      И все эти компоненты лежат на panel 
      Align =client 
       
      Тестирую на экране 5.5
      Естественно вопрос что произошло и как это исправить 
    • Автор: ENERGY
      Как залить с Delphi Android в базу MySql строки, я примерно понял - составляем GET запрос и вставляем строки в параметры, затем считываем их в PHP скрипте и в базу.
      А вот как быть с картинкой. Как добавить картинку через PHP скрипт из программы на Android?
      POST запрос? Кто нибудь делал такое уже?
      Спасибо 
       
      P.s. На данный момент FireDAC не поддерживает работу с MySQL из под Android. Пока только SQLite и  InterBase ToGo. Даже если в будущем будет поддерживать, многие на этом форуме рекомендуют не использовать прямое подключение к базам из под мобильных систем, а использовать прямые GET запросы к примеру к PHP скриптам. Это связано с нестабильностью интернета т.к. так интернет может часто переключаться (от вышки к вышке) и менять параметры подключения. 
    • Автор: Макс Войтенко
      я знаю что можно добавить внешний файл в программу по пути (assets\internal)(скриншот) (раньше получали к нему доступ через)
      loadfromfille(GetDocumentsPath()+"test.txt")
      Сейчас GetDocumentsPath убрали из RadStudio и походу заменили чем то.
      я использовал в свой программе директорию 
      loadfromfille(GetHomePath()+"test.txt"), но я не знаю куда мне добавить программу через deploymant (скриншот)
      Тоесть
      1)GetDocumentsPath = (assets\internal) 
      2)GetHomePath= ??????
      3)GetDocumentsPath убрали из radstudio.
      Какую мне прописать директорию чтоб я имел к ней доступ через GetHomePath()??

    • Автор: Алмаз Амангельды
      Привет всем! 
      Кодить начал на андроид совсем недавно возникают некие проблемы и спорные вопросы, и перейду сразу к вопросу как пользоваться BoringSSL под Андроид 6 и ниже, возможно ли использовать BoringSSL  на андроидах ниже 6, и как реализовать сие чудо!
      З.Ы если есть возможность опишите по подробнее...
      (дело в том что я хочу спрарсить парочку постов с паблика VK)
       
  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу