Перейти к содержанию
Fire Monkey от А до Я
  • 0

OpenDialog для мобильных платформ


Камышев Александр

Вопрос

android, Seattle

Надо пользователю дать возможность выбирать файлы, к примеру из downloads. OpenDialog на моб. пл. не работает.

Может есть у кого наработки? спс.

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
  • Модераторы

для картинок есть родной Action, а вот для файлов нужно через интенты попробовать.

например есть родной файловый менеджер/totalcmd они могут отдать путь к файлу.

Но как это делается не интересовался

а если делать еще и для IOS, то лучше самому навигатор по файлам сделать

Изменено пользователем ZuBy
Ссылка на комментарий
  • 0

У меня, кажется с 5-го Android, при выборе файлов в приложениях появляется такой диалог.

Screenshot_20160915-153320.png

Скрин при выборе прикрепляемого документа в Skype.

Как его вызывать, тоже интересно. В Windows TOpenDiaolg. А что в iOS?

 

Ссылка на комментарий
  • 0
  • Модераторы
Только что, Pax Beach сказал:

У меня, кажется с 5-го Android, при выборе файлов в приложениях появляется такой диалог.

Screenshot_20160915-153320.png

Скрин при выборе прикрепляемого документа в Skype.

Как его вызывать, тоже интересно. В Windows TOpenDiaolg. А что в iOS?

вот об этом я и говорил, а в IOS вообще такое есть?

она же не принимает ничего, кроме картинок. остальные файлы доступны только конкретному приложению. или я не прав?

Ссылка на комментарий
  • 0
  • Модераторы

Не на всех устройствах есть родной файловый менеджер. Поэтому интенты не считаю идеальным вариантом. Идеальным будет вызов своего диалога для выбора файлов или попробуйте подключить уже готовые java-либы с диалогом для выбора файлов.

Ссылка на комментарий
  • 0
  • Администраторы

На ios штатного диалога нету, кроме выбора фотки и видео. Это противоречит концепции apple. Там наоборот не хотят юзеру навязывать папочную структуру. НО, не смотря на это, функции по чтении директорий системы доступны. И вы в принципе, как минимум, можете её прочитать и самостоятельно ее визуализировать в UI.

Ссылка на комментарий
  • 0

Нашел такие полезные примеры по теме на английском языке:

Будем изучать )

Ссылка на комментарий
  • 0
String fn;
String path = System::Ioutils::TPath::GetSharedDownloadsPath();
#ifdef __ANDROID__
	TSearchRec sr;
	if ( !FindFirst( path + "/*", faAnyFile, sr) )
		{
			do
				{
					if ( sr.Name=="." || sr.Name==".." ) {}
					else if ( (sr.Attr & faDirectory) == faDirectory ) {} // dir
					else {} // file
					// отрисовать в список sr.Name
					sr.Name;
				} 
			while ( !FindNext(sr) );
			FindClose(sr);
			// по клику в списке получить fn = path + "/" + name;
		}
#else
	OpenDialog->InitialDir = System::Ioutils::TPath::GetSharedDocumentsPath();
	if ( !OpenDialog->Execute() ) return;
	fn = OpenDialog->FileName;
#endif

вот так сделал, кому понадобится, на паскале тоже работает, только синтаксис другой

Изменено пользователем Камышев Александр
Ссылка на комментарий
  • 0
В 15.09.2016 в 11:22, Равиль Зарипов (ZuBy) сказал:

для картинок есть родной Action, а вот для файлов нужно через интенты попробовать.

например есть родной файловый менеджер/totalcmd они могут отдать путь к файлу.

Но как это делается не интересовался

а если делать еще и для IOS, то лучше самому навигатор по файлам сделать

Равиль написал "для картинок есть родной Action, а вот для файлов нужно через интенты попробовать". Поясните пожалуйста как выбрать картинку расположенную где то на мобильном устройстве?

Олег Киреев.

Ссылка на комментарий
  • 0

Здравствуйте Ярослав.

СпасиБО за ссылку. Я её изучил. Очень полезно. Но у меня немного другая задача. Мне надо занести в БД сфотографированную картинку. Как заносить в БД потоком я знаю, но как получить в переменную имя этого файла фото???? Под Виндовс есть компонент OpenDialog и через него всё просто. Под Андроид такого компонента нет. Пожалуйста Ярослав посоветуйте как это реализовать?

С Уважение Олег. 

Ссылка на комментарий
  • 0

вот кусок кода "вырванный" из проекта (написано благодаря ссылке ярослава выше- спасибо):

MimeType = image/* - для картинок. если что не так, комментируйте.

type
  TDialog = class
  private
    FProc: TProc<string>;
    procedure ResultCallback(const Sender: TObject; const M: TMessage);
  public
    constructor Create;
    destructor Destroy; override;
    procedure Show(const MimeType: string; Proc: TProc<string>);
  end;

constructor TDialog.Create;
begin
  TMessageManager.DefaultManager.SubscribeToMessage(TMessageResultNotification, ResultCallback);
end;

destructor TDialog.Destroy;
begin
  TMessageManager.DefaultManager.Unsubscribe(TMessageResultNotification, ResultCallback);
end;

procedure TDialog.ResultCallback(const Sender: TObject; const M: TMessage);
var FilePath: string;
begin
  if TMessageResultNotification(M).RequestCode = 5 then
  if TMessageResultNotification(M).ResultCode = TJActivity.JavaClass.RESULT_OK then
  begin
    FilePath:=JStringToString(TMessageResultNotification(M).Value.getData.getPath);
    FProc(FilePath);
  end;
  Free;
end;

procedure TDialog.Show(const MimeType: string; Proc: TProc<string>);
var
  Intent: JIntent;
begin

  FProc:=Proc;

  Intent:=TJIntent.Create;
  Intent.setAction(TJIntent.JavaClass.ACTION_PICK);
  Intent.setType(StringToJString(MimeType));

  MainActivity.startActivityForResult(Intent,5);

end;

procedure OpenFileDialog(const MimeType: string; Proc: TProc<string>);
begin
  RequestPermissionsExternalStorage(
  procedure(Granted: Boolean)
  begin
    if Granted then TDialog.Create.Show(MimeType,Proc);
  end);
end;

 

Ссылка на комментарий
  • 0
uses
  System.SysUtils,
  System.IOUtils,
  System.Permissions,
  System.Messaging,
  FMX.Dialogs;

uses
  Androidapi.Helpers, Androidapi.JNI.Os, Androidapi.JNI.GraphicsContentViewText,
  Androidapi.JNI.JavaTypes, Androidapi.JNI.Webkit, Androidapi.JNI.Net,
  Androidapi.JNI.App, Androidapi.JNI.Support, FMX.Platform.Android;

это потребуется

Ссылка на комментарий
  • 0

СпасиБО SLAVZ. Попробую.

Может Вам  пригодится я вот так вышел и положения:

Сначала:

//выбираем фото из галереи устройства
procedure TForm_haracteristik.TakePhotoFromLibraryAction1DidFinishTaking(
  Image: TBitmap);
begin
Image_ФотоХаракДвиг.Bitmap.Assign(Image);
end;

Потом вношу в Базу:

//ввести харак-ку
procedure TForm_haracteristik.Button_ВвестиClick(Sender: TObject);
begin
if Edit_НазваниеХарактеристики.Text='' then
   begin
   ShowMessage('Вы не ввели название характеристики.');
   Abort;
   end;
//проверяем наличие дубля названия характеристики:
FDQuery_Engin.Open;
FDQuery_Engin.SQL.Clear;
FDQuery_Engin.SQL.Add('select * from Tab_Harak_Engin where Name_Harak = ' + #39+ Edit_НазваниеХарактеристики.Text +#39);
FDQuery_Engin.Active:=True;
if FDQuery_Engin.RecordCount > 0 then
  begin
  ShowMessage('Такое название уже есть !');
  Abort;
  end else
   begin
    Try
    FDQuery_Engin.Active:=False;
    FDQuery_Engin.SQL.Clear;
    FDQuery_Engin.SQL.Add('SELECT * FROM Tab_Harak_Engin ORDER BY Name_Harak' );
    FDQuery_Engin.Active:=True;
    //вставляем строку новой модели:
    FDQuery_Engin.Insert;
    FDQuery_Engin.FieldByName('Name_Harak').AsString:=Edit_НазваниеХарактеристики.Text;
    //заносим в поток файл картинки
     IconStream:=TMemoryStream.Create;
     Image_ФотоХаракДвиг.Bitmap.SaveToStream(IconStream);
     IconStream.Position := 0;
     (FDQuery_Engin.FieldByName('Harak_Engin') as TBlobField).LoadFromStream(IconStream);
     IconStream.Free;
    FDQuery_Engin.Post;
    ShowMessage('Введено.');
    Except
    ShowMessage('Ошибка ввода в базу.');
    End;
   end;
//перезагружаем Boxы
Box_НазвХарДвиг.Clear;
Box_НазвХарДвигУдаление.Clear;
FDQuery_ComboBox_Engin.Active:=False;
FDQuery_ComboBox_Engin.SQL.Clear;
FDQuery_ComboBox_Engin.SQL.Add('SELECT Name_Harak FROM Tab_Harak_Engin ORDER BY Name_Harak');
FDQuery_ComboBox_Engin.Active:=True;
  for i:=1 to FDQuery_ComboBox_Engin.RecordCount do
    begin
    FDQuery_ComboBox_Engin.RecNo:=i;
    Box_НазвХарДвиг.Items.Add(FDQuery_ComboBox_Engin.FieldByName('Name_Harak').AsString);
    Box_НазвХарДвигУдаление.Items.Add(FDQuery_ComboBox_Engin.FieldByName('Name_Harak').AsString);
    end;
end;

Так удаляю из базы если надо:

//удалить
procedure TForm_haracteristik.Button_УдалитьClick(Sender: TObject);
begin
if Box_НазвХарДвигУдаление.ItemIndex=-1 then
   begin
   ShowMessage('Вы не выбрали имя характеристики.');
   Abort;
   end;
TX:='';
TX:=Box_НазвХарДвигУдаление.Selected.Text;

//становимся на эту позицию
FDQuery_Engin.Active:=False;
FDQuery_Engin.SQL.Clear;
FDQuery_Engin.SQL.Add('SELECT * FROM Tab_Harak_Engin where Name_Harak= '+#39+TX+ #39);
FDQuery_Engin.Active:=True;
 Try
 FDQuery_Engin.Delete;
 ShowMessage('Удалено.');
 Except
 ShowMessage('Не удалось удалить.');
 End;

//перезагружаем Boxы
Box_НазвХарДвиг.Clear;
Box_НазвХарДвигУдаление.Clear;
FDQuery_ComboBox_Engin.Active:=False;
FDQuery_ComboBox_Engin.SQL.Clear;
FDQuery_ComboBox_Engin.SQL.Add('SELECT Name_Harak FROM Tab_Harak_Engin ORDER BY Name_Harak');
FDQuery_ComboBox_Engin.Active:=True;
  for i:=1 to FDQuery_ComboBox_Engin.RecordCount do
    begin
    FDQuery_ComboBox_Engin.RecNo:=i;
    Box_НазвХарДвиг.Items.Add(FDQuery_ComboBox_Engin.FieldByName('Name_Harak').AsString);
    Box_НазвХарДвигУдаление.Items.Add(FDQuery_ComboBox_Engin.FieldByName('Name_Harak').AsString);
    end;
end;
 

Так просматриваю:

//просмотр картинки
procedure TForm_haracteristik.ComboBox_НазвХарДвигChange(Sender: TObject);
begin
//становимся на эту позицию
//FDQuery_Engin.Locate('Name_Harak',TX,[loPartialKey, loCaseInsensitive]);

FDQuery_Engin.Active:=False;
FDQuery_Engin.SQL.Clear;
FDQuery_Engin.SQL.Add('SELECT * FROM Tab_Harak_Engin where Name_Harak= '+#39+Box_НазвХарДвиг.Selected.Text+ #39);
FDQuery_Engin.Active:=True;
 Try
  //заносим в поток файл картинки
  IconStream:=TMemoryStream.Create;
  (FDQuery_Engin.FieldByName('Harak_Engin') as TBlobField).SaveToStream(IconStream);
  If IconStream.Size<>0 then
   begin
   IconStream.Position:=0;
   Image_Просмотр.Bitmap.LoadFromStream(IconStream);
   IconStream.Free;
   end  else
    begin
    ShowMessage('Нет фото.');
    Exit;
    end;
 Except
 ShowMessage('Не удалось загрузить фото.');
 End;
end;

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...