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

yooSee

Пользователи
  • Постов

    33
  • Зарегистрирован

  • Посещение

  • Победитель дней

    1

Сообщения, опубликованные yooSee

  1. Привет форумчане, вопрос стоит в следующем. 

    На телефоне создается zip архив и его нужно передать через мессенджер "WhatsApp" используя намерения делфи. 

    как было раньше до Api 26

    var
      Intent: JIntent;
    begin
      Intent := TJIntent.Create;
      Intent.setAction(TJIntent.JavaClass.ACTION_SEND);
      Intent.setDataAndType
        (StrToJURI('file:' + TPath.Combine(TPath.GetPublicPath,
        Form1.Label1.Text + '.zip')), StringToJString('*/zip'));
      SharedActivity.startActivity(Intent);

    сейчас нужно использовать FileProvider и я сделал следующее:

    В манифесте проекта прописано  - 

    <provider android:name="android.support.v4.content.FileProvider"
    android:authorities="%package%.provider" //здесь мой пакет
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
    android:name="android.support.FILE_PROVIDER_PATHS"
    android:resource="@xml/fileprovider" />
    </provider>

    fileprovider.xml создан и добавлен в проект с содержимым 

    <?xml version="1.0" encoding="utf-8"?>
    <paths xmlns:android="http://schemas.android.com/apk/res/android">
        <external-path name="external_files" path="."/>
    </paths>

     

    Uri URI = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".my.package.name.provider", createFile());

    в данный момент не пойму как преобразовать данную строку в запрос Intent?  Intent.setDataAndType  .... ? Где описывается FileProvider ? что в URI? 

  2. В 12.02.2019 в 18:05, Barbanel сказал:

    В поставке 10.3 есть примеры работы с правами.

    Один из них можно найти по такому пути:
    C:\Users\Public\Documents\Embarcadero\Studio\20.0\Samples\Object Pascal\Multi-Device Samples\Media\PhotoEditorDemo

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

    Благодарю!

  3. В 12.02.2019 в 00:26, Евгений Корепов сказал:

    Для полноценной работы вам нужно добавить параметры в вызов (иначе вы не узнаете дал ли пользователь разрешение или нет)

    
    PermissionsService.RequestPermissions([FPermissionWrite, FPermissionRead], nil);

    Вот так:

    
    PermissionsService.RequestPermissions([FPermissionWrite, FPermissionRead], PermissionRequestResult, ExplainReason);

    PermissionRequestResult - это обработка ответа пользователя

    
    procedure TForm.PermissionRequestResult(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>);
    begin
      if (Length(AGrantResults) = 2) and (AGrantResults[0] = TPermissionStatus.Granted) and (AGrantResults[1] = TPermissionStatus.Granted) then
      begin
        // Ура! Пользователь дал разрешение на оба наших запроса. Выставялем глобальные флаги (к примеру) которые сигнализируют что можно читать/писать карту памти
      end
      else
        TDialogService.ShowMessage('Не возможно продолжить работу, требуемые разрешения не получены')
    end;

    И ExplainReason - если пользователь сдуру не дал разрешение, то вам нужно объяснить ему что без этого приложение работать не будет.

    
    procedure TForm.ExplainReason(Sender: TObject; const APermissions: TArray<string>; const APostRationaleProc: TProc);
    begin
      TDialogService.ShowMessage('Приложению нужен доступ к карте памяти для таких то целей, иначе приложение не сможет работать. Зайдите в настроки Андроид и дайте разрешение на доступ',
        procedure(const AResult: TModalResult)
        begin
          APostRationaleProc;
        end)
    end;

     

    Спасибо за дополнение!

  4. Всем привет, вот и я решил внести свою лепту в жизнь форума и сегодня мы разберемся с разрешениями на Delphi Rio под Андроид. 

    Для примера мы будем использовать разрешения на чтение и запись с памяти устройства, для начала в нашем проекте выставим в Delphi>Project>Application>Uses Permissions галочки на Read External Storage и Write External Storage.

    в uses проекта добавьте следующее

    uses
      System.Permissions,
      Androidapi.Jni.Os,
      Androidapi.Helpers,

    далее  создадим переменные

    var
      Form: TForm;
    ....
      FPermissionWrite: string;
      FPermissionRead: string;

    в Form.Create добавим следующий код

    procedure TForm.FormCreate(Sender: TObject);
    begin
       FPermissionWrite := JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE); //Значение на запись
      FPermissionRead := JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE); //Значение на чтение
    end;

    и теперь сам не посредственно запрос на подтверждение наших прав

    procedure TForm.Button1Click(Sender: TObject);
    begin
      PermissionsService.RequestPermissions
        ([FPermissionWrite, FPermissionRead], nil);
    end;
    //это вызовет окно с запросом разрешения прав
    

    ну и для проверки бросим на форму TMemo и пару TButton , в них реализуем сохранение и чтение из файла с памяти устройства

    procedure TForm.Button1Click(Sender: TObject);
    begin
      Memo1.Lines.LoadFromFile(TPath.Combine(TPath.GetSharedDocumentsPath,
        'test.txt'));
    end;
    
    procedure TForm.Button2Click(Sender: TObject);
    begin
      Memo1.Lines.SaveToFile(TPath.Combine(TPath.GetSharedDocumentsPath,
        'test.txt'));
    end;

    P.S. Напоминаю что для работы TPath нам понадобится подключить в Uses 

    uses
    System.system.ioutils;

    Надеюсь материал будет полезен! 

     

     

     

    Permissions.zip

  5. 11 минут назад, x11 сказал:

    не нужно было это публиковать в явном виде :( уже закрыли, видать эту лазейку

    Если кто скачать 1,75, перевыложите, пожалуйста

    Да это сайт их лагает, у меня 1.75 бетка есть

  6. Так же в телеграмм создал группу и канал посвященный OrangeUI , всем кому интересен данный компонент добро пожаловать @orangeui , будем разбираться вместе

    Канал - @orangeuichannel

    Группа - @orangeui

  7. 2 часа назад, krapotkin сказал:

    если у TText просто задать Align=top и AutoSize, то и размер посчитается автоматически

    а когда размер подсчитается, размер контейнера тоже можно подсчитать

    а если контейнер - скроллбокс то вроде и не нужно...

    спасибо!

  8. Привет Всем уважаемые! 

    Пытаюсь сделать растягивание по содержимому компонента. Как это реализовано в мессенджерах типа WhatsApp если большой текст то растягивает (выделяется) по содержимому большое поле, если короткий то малое. 

      Text2.Text := Memo1.Lines.Strings[4];
      text2.Height := canvas.TextHeight(Text2.Text); //по высоте строки меняется т.к. там и есть одна строка в TText просто переносится WordWrap визуально.
      text2.Height:=canvas.TextWidth(text2.Text); //  - так чушь 

    Как это вообще реализовано кто нибудь сталкивался?

    111.png

  9. 28 минут назад, Роман Фил сказал:
    
          begin
    
              AItem := ksTableView1.Items.AddItem('Новая строка',
                Memo1.Lines.Strings, 'Подробнее', atMore);
              AItem.Image.Bitmap.LoadFromUrl(Memo1.Lines.Strings);
    
            end;
          ksTableView1.EndUpdate;
        end)

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

    дополню при нажатии на строку картинка появляется. как будто обновляется 

      TThread.Synchronize(TThread.CurrentThread,
        procedure
        var
          ICount: Integer;
          AItem: TksTableViewItem;
          i: Integer;
        begin
          Memo1.Text := AResult;
          ksTableView1.BeginUpdate;
          application.ProcessMessages;
          try
            for i := 0 to Memo1.Lines.Count - 1 do
            begin

              AItem := ksTableView1.Items.AddItem('Новая строка',
                Memo1.Lines.Strings, 'Подробнее', atMore);
              AItem.Image.Bitmap.LoadFromUrl(Memo1.Lines.Strings);

            end;
          finally
            ksTableView1.EndUpdate;
          end; в таком варианте почему о не обновляется

  10.       begin
    
              AItem := ksTableView1.Items.AddItem('Новая строка',
                Memo1.Lines.Strings, 'Подробнее', atMore);
              AItem.Image.Bitmap.LoadFromUrl(Memo1.Lines.Strings);
    
            end;
          ksTableView1.EndUpdate;
        end)

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

  11. Привет ребят! Помогите кто знает, попытаюсь доходчиво объяснить - 

    имеется набор компонентов KernowSoftwareFMX - в нем использую TksTableView для вывода данных с Tmemo, в нем так же есть Image.

    В Tmemo с сервера грузится файл txt внутри которого строки с ссылками на изображения вида http://бла-бла/1.png

    Для загрузки использую FMX.Features.Bitmap.Helpers.pas - позволяет по прямой ссылке загружать изображение в TImage.

    что пытаюсь сделать?

    Нужно наполнять список TksTableView с Memo содержащий ссылки и в строках TksTableView - они же ListItem тоже самое что в ListView  и загружать в image каждой строки картинки по ссылкам memo.

     

    
               
                          
          AItem.Image.Bitmap := Image4.MultiResBitmap.Bitmaps[1].LoadFromUrl(Memo1.Lines.Strings[i]);    - так ругается
            [DCC Error] untMain.pas(92): E2010 Incompatible types: 'TBitmap' and 'procedure, untyped pointer or untyped parameter'
           AItem.Image.Bitmap :=     Image4.Bitmap.LoadFromUrl(Memo1.Lines.Strings[i]);  - так тожн не работает          
                          

    Глюк в том что первым делом создаются строки . а потом грузятся по очереди картинки в Image4.

    Как заставить подгружать картинки в  TksTableView?

    Как ожидать хавершения загрузки каждой картинки в Image4 и после создавать AItem.Image.Bitmap?

     

     

     

  12. Всем привет пытаюсь грузить файлы изображения с телефона Android на сервер методом post запроса. Для этого один из параметров запроса должен содержать полный путь к файлу. В ActionList есть стандартная опция TakePhotoFromLibraryAction - к с нее выдрать путь??? Куда он ей передается и передается ли вообще? я и справки толком не нахожу или я слепой?

     

    imgfile.Text:=TakePhotoFromLibraryAction1.????

     

  13. 10 часов назад, Rusland сказал:

    Приложение свернуто или закрыто.

    Отправляю один пуш, на телефоне в шторке появляется уведомление.

    Отправляю еще один, появляется второе уведомление и так далее. Сколько пушей, столько и уведомлений.

    Как сделать чтобы все уведомления собирались в одном уведомлении в шторке? (как делают telegram, whatsapp и т. п.)

    Не знаю есть ли такое решение в намерениях но как альтернатива - копии в переменную количество созданных уведомлений , при появлении дубликата гаси ранее созданное и в заголовке нового уведомления выводи общее количество. В примерах где то видел подобное.

    Если закрыто апк поднимай сервер 

  14. Привет ребят, созрел такой вопрос который меня мучает ! Вобщем пытаюсь загрузить картинку по прямой слыке с сервера. Картинка не грузится, не сохраняется не отображается. 

    Конечная платформа - Андроид. Пишу на Delphi xe 10 seatle.

    Что я делаю? при нажатии на сам компонент TImage (созданный динамически), должна грузится картинка по адресу преждевременно записанное в hint (TImage) при создании вида (http://блаблабла.jpg)

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

     

    var
      s: string;
      fs: TFileStream;
    begin
      fs := TFileStream.Create(tpath.Combine(tpath.GetDownloadsPath, 'load.jpg'),
        fmCreate);
    
      NetHTTPClient1.Get((Sender as TImage).Hint, fs);
      fs.Free;
    
      (Sender as TImage).MultiResBitmap.Bitmaps[1].LoadFromFile
        (tpath.Combine(tpath.GetDownloadsPath, 'load.jpg'));

    подключал еще pas нашел на этом форуме FMX.Features.Bitmap.Helpers.pas

      (Sender as TImage).MultiResBitmap.Bitmaps[1].LoadFromUrl
        ((Sender as TImage).Hint);

    как проще сделать посоветуете чтоб и грузилось и форма не висла?

  15. В 16.06.2017 в 01:49, sinuke сказал:

    не надо удалять/пересоздавать. просто нужно контролировать эти добавляющиеся строки в Memo. для этого можно использовать свойства Tag и TagString чтобы знать, какой компонент соответствует какой строке.

    спасибо большое все помогло)

  16. ПРивет, есть ли возможность узнать как то номер сроки в memo на delphi FMX в memo при нажатии на текст в поле memo?

    для windows на vlc можно memo.CaretPos.Y либо через WinAPi заголовки. Как такое делать в FireMonkey FMX для андроид ума не приложу. Может кто делал, поделится опытом?

  17. 30 минут назад, sinuke сказал:

    я так понял, что ваш код выдает следующее:

    59429ff7edeeb_.PNG.3c4981de56f5821e7ed999d90b459ba4.PNG

     

    а надо:

    5942a00f04d07_2.PNG.ea6c71cffe7febc20debffb8b68dc0d3.PNG

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

    
    var
      i: integer;
      p: Integer;
      txt: TText;
    begin
      p := 0;
      for i := Memo1.Lines.Count - 1 downto 0 do
      begin
        txt := TText.Create(self);
        txt.Parent := Form2;
        txt.Position.Y := p + 1;
        txt.Align := TALignLayout.Top;
        txt.Text := Memo1.Lines.Strings[i];
        p := Round(p + txt.Height);
      end;
    end;

    а если добавилась строка в memo то все компоненты удалять и пересоздавать с новым или проверять на наличие строк и создавать не достающие7 может есть еще какие варианты?

  18. 18 минут назад, sinuke сказал:

    я так понял, что ваш код выдает следующее:

    59429ff7edeeb_.PNG.3c4981de56f5821e7ed999d90b459ba4.PNG

     

    а надо:

    5942a00f04d07_2.PNG.ea6c71cffe7febc20debffb8b68dc0d3.PNG

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

    
    var
      i: integer;
      p: Integer;
      txt: TText;
    begin
      p := 0;
      for i := Memo1.Lines.Count - 1 downto 0 do
      begin
        txt := TText.Create(self);
        txt.Parent := Form2;
        txt.Position.Y := p + 1;
        txt.Align := TALignLayout.Top;
        txt.Text := Memo1.Lines.Strings[i];
        p := Round(p + txt.Height);
      end;
    end;

    Спасибо большое помог) 

  19. 46 минут назад, sinuke сказал:

    если я правильно понял проблему, то надо явно указывать координату для компонента, желательно чтобы она была "координата предыдущего + высота предыдущего + 1"

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

    var
      i: integer;
    begin
    for i := memo1.Lines.Count-1 downto 0 do
      begin
        memo2.Lines.Add(memo1.Lines.Strings[i]);
      end;
    end;

    если делат атк к примеру то выведет сначала последний потом все по порядку, в чем затуп?

    var
      i: integer;
      txt: TText;
    begin
      for i := Memo1.Lines.Count - 1 downto 0 do
      begin
        txt := TText.Create(self);
        txt.Parent := Form2;
        txt.Align := TALignLayout.Top;
        txt.Text := Memo1.Lines.Strings[i];
    
      end;
    end;

     

×
×
  • Создать...