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

Humanoid

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

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

  • Посещение

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

  1. При отправке почты понадобилось сохранить изображение и добавить его в аттач сообщения.
    Проблема свелась к правильному получению URI файла изображения.
    Самостоятельно не смог побороть. Обратился за помощью к krapotkin.
    Спасибо ему огромное за помощь.
    Ну и может быть кому то будет полезен сей опыт.
    Реализовано под D10.4 Sydney
    Вот решение.
    В параметрах проекта включаем "Secure File Sharing",  при этом система автоматом создаст необходимые файлы для FilePropvider.
    Ну и собственно получение URI файла через TAndroidHelper.JFileToJURI
     

    procedure TfmDecoder.TestSendEmail();
    {$IF DEFINED(ANDROID)}
     var
      lIntent: JIntent;
      lJRecipient: TJavaObjectArray<JString>;
      lURI: Jnet_Uri;
      lFileName: string;
      lFilePath: string;
      lFilePathFileName: string;
    
      Delim :Char;
    //  Surf : TBitmapSurface;
    {$ENDIF}
    
    
    begin
     lFileName := Concat('MyFile' ,'.jpg') ;
     lFilePath := System.IOUtils.TPath.GetPublicPath ;
     lFilePathFileName := System.IOUtils.Tpath.Combine(lFilePath, lFileName) ;
     Surf:=TBitMapSurface.Create;
     SaveParams.Quality:=100;
     try
       Surf.Assign(imResult.Bitmap);
     // Save file
       TbitMapCodecManager.SaveToFile(lFilePathFileName, Surf, @SaveParams);
     finally
       Surf.Free;
     end;
    {$IF DEFINED(ANDROID)}
      lJRecipient:= TJavaObjectArray<JString>.Create(1);
      lJRecipient.Items[0]:= StringToJString('xxxxxxx@yyyy.com');
    
      lIntent:= TJIntent.Create;
    
      lIntent.setType(StringToJString('message/rfc822'));
      lIntent.setAction(TJIntent.JavaClass.ACTION_SEND);
      lIntent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
      lIntent.putExtra(TJIntent.JavaClass.EXTRA_EMAIL, lJRecipient);
      lIntent.putExtra(TJIntent.JavaClass.EXTRA_SUBJECT, StringToJString('Subj'));
      lIntent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString('Text'));
    
      lUri:= TAndroidHelper.JFileToJURI(
          TJFile.JavaClass.init(StringToJString(lFilePathFileName)));
    
      lIntent.putExtra(TJIntent.JavaClass.EXTRA_STREAM,TJParcelable.Wrap(lUri)) ;
    
      try
        TAndroidHelper.Activity.startActivity(lIntent);
      except
        on E: Exception do
        begin
          ShowMessage( E.Message);
        end;
      end;
    {$ENDIF}
    end;

     

  2. Может кто то сталкивался с такой проблемой и знает решение?
    Не могу найти как включить форматер кода. Ни Ctrl+D не работает. Нет ни в контекстном меню, ни в настройках. Можно его как то "достать"?
    Сидней.

  3. Кроссплатформенное приложение.
    Картинка с камеры. На ней лежит ректангл. Вырезаю часть изображения по ректанглу. В винде все прекрасно. В андроид все смещается в зависимости от выбранного разрешения камеры.  
    Вопрос: Не пойму как соотносятся физический, логический  размер экрана, Размер самого изображения и размеры контейнера (в моем случае Layout) в котором лежит изображение, между собой. Т.е. не могу правильно получить координаты вырезки на изображении. Как соотнести координаты ректангла с координатами изображения?
    Вот последние изыскания в этом направлении.
    Так хотя бы по высоте не прыгает...
    Просветите плиз, как это все соотносится.

     

    type
      TScreenS = record
        w: Single; // logic
        H: Single; // logic
        wp: Single; // phisics
        Hp: Single; // phisics
        D: Single; // scale display
      end;
    
    var
      ScrSize:  TScreenS;
      imgDest : TBitMap;
      SouRec, DisRec: TRectF;
      .....
    
      ScrSize := GetScreenSize;
      Scale := imgCamera.Bitmap.Height / Layout1.Height;
      Ww := imgCamera.Bitmap.Width / Scale; // Ширина изображения приведенная к пропорции высоты
      tx := ((Layout1.Width - Ww) / 2); // Смещение изображения относительно контейнера по Х
      t:=0; // Смещение изображения относительно контейнера по Y
    
    
    {$IFDEF ANDROID}
      Scale := Scale *  ScrSize.D; // Масштаб для андроида с учетом масштаба экрана
    {$ENDIF}
    
    
      imgDest.Width := Rectangle1.Width;
      imgDest.Height := Rectangle1.Height;
    
    // Исходная зона для копирования 
    // Х = позиция ректангла по Х минус смещение относительно контейнера
    // Y = позиция ректангла по Y минус смещение относительно контейнера
    // конечная позиция то же плюс размеры ректангла
      SouRec := TRectF.Create((Rectangle1.Position.X - tx) * Scale,
        (Rectangle1.Position.Y - t) * Scale,
        (Rectangle1.Position.X + Rectangle1.Width - tx) * Scale,
        (Rectangle1.Position.Y + Rectangle1.Height - t) * Scale);
    // Для Андроид добавляю разницу по высоте между физическим и логическим размерами экрана
    
    {$IFDEF ANDROID}
      SouRec := TRectF.Create((Rectangle1.Position.X - tx) * Scale,
        (Rectangle1.Position.Y + (ScrSize.hp - ScrSize.h)) * Scale,
        (Rectangle1.Position.X + Rectangle1.Width - tx) * Scale,
        (Rectangle1.Position.Y + Rectangle1.Height + (ScrSize.hp - ScrSize.h)) * Scale);
    {$ENDIF}
    
      DisRec := TRectF.Create(0, 0, Rectangle1.Width * Scale, Rectangle1.Height * Scale);
    
      imgDest.Bitmap.SetSize(Round(Rectangle1.Width * Scale),
        Round(Rectangle1.Height * Scale));
     
      imgDest.Bitmap.Canvas.BeginScene;
      imgDest.Bitmap.Canvas.DrawBitmap(imgCamera.Bitmap, SouRec, DisRec, 1);
      imgDest.Bitmap.Canvas.EndScene;

     

  4. Ноут hp probook 470 g3 i7
    Диск форматирован.
    Установил Win 10 64Х
    Ставил Александрию на  на системный диск.
    Результат тот же. 😡 SDK не доставился. Все компоненты в "Edit SDK" с желтыми треугольничками....
    Т.е. SDK стал криво..
    Переформатил все и вернул 10-ку Сидней. Подожду нормальной сборки 11-й версии.

  5. Благодарю за долготерпение.
    Есть еще ноут как раз под переустановку. Поставлю с нуля винду и Александрию. Подозреваю, что какой то "хвост" оставался от предыдущих установок. Хотя вроде чистил тщательно. Еще раз Спасибо.

  6. 1 час назад, Hevard сказал:

    что было непонятно

    Дык объясняю. Понятно все!
    Галочки включены. Скачивание прошло. Только вот в 10-ке все ставало самостоятельно, а в 11 -й никак не желало становиться. При всех включенных галочках и вычищенном реестре, и удаленных всех воспоминаниях предыдущих установок.  Только принудительно средствами   Андроид студио пришлось установить рабочую часть СДК, а потом средствами этого СДК пришлось докачать и установить недостающие части СДК через командную строку. При этом параллельно понадобилось разобраться с Явой, потому как эта часть СДК без нее не запускалась.
    Т.е. не ясно было как установить СДК если студия его не желает ставить ни в какую.  ))) 

    Вот об этом и были мои вопросы. 

  7. 8 часов назад, Hevard сказал:

    Это не платформа встала криво, а Вы ее так установили.

    Ставил 11-ю четыре раза, с полной чисткой от всех хвостов Embarcadero, RAD, Studio, Android В различных вариантах. Только Делфи и С билдер. В полном составе со всеми платформами, Только Делфи и Андроид. Естественно с СДК, ДЖДК всегда с одинаковым результатом. Криво установленным СДК. Т.е. по путям своей установки стулия СДК не видит.
    10-ка становилась всегда ровно и без проблем. Все видела.

     

    8 часов назад, Hevard сказал:

    где Вы вычитали про какие-то последовательности установок Явы, СДК, и "что-то" ещё.


    Вот это помогло исправить ситуацию.https://dannywind.nl/delphi/android-sdk-for-delphi-11-2-alexandria/
    Ну и в некоторых описаниях установки Адроид студио. Т.е. самого СДК нет в виде архива или инсталятора, а ставится какая то часть, а потом с ее помощью докачивается сам СДК. В крайнем случае я так понял из всех своих танцев с бубном. И опять таки, перед установкой даже этой части надо установить Яву,  И именно так у меня и получилось.  Об этом и спрашивал. Это и подразумевал под платформой.
    Еще раз благодарю за участие и извиняюсь за то что отобрал у Вас время.
    С уважением

  8. 10 часов назад, Hevard сказал:

     

    Мда... Я еще и косноязычен... ((( Как поставить Дельфи я знаю. Я имел в виду по установке среды для андроид. Т.е. Что для этого надо, где взять, в какой последовательности ставить... Ява, СДК, ... Чтото еще... Это имел в виду.
    Из "коробки" ставил начиная с 7-й версии. 
    Эмбаркодеро  ставил с 10 Рио. Но, тогда интересовал только Делфи. Когда понадобился андроид, поставил Сидней. Все стало из коробки. Даже не задумывался как выглядит платформа мобильного.
    А вот когда решил установить Александрию, платформа стала криво. И тогда задался вопросом, как она устроена. И как ее ставить и настраивать...
    Как то так.
    В общем еще раз СПАСИБО!
    И может подскажете, что от меня хочет при попытке загрузить в телефон. Приложение с таким именем впервые в телефон.
    И как и где указать сертификат и где его взять? Извините что нагрузил как баржу утюгами. 

  9. 3 минуты назад, krapotkin сказал:

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

    Пробовал так... При попытке охранения ругается и сбрасывает все мои потуги.
    Ткните еще носом плиз. При попытке загрузить в телефон приложения получаю такую ошибку.
    Понимаю, что надо где то ручками указать как его собирать. И надо гдето, как то прописать сертификат... Ткните носом где и как это сделать.
    Хотя, может это еще и от криво поставленного СДК.
     

     

    11 минут назад, Hevard сказал:

    Какое-то у Вас "садо-мазо" происходит.

    Ну тут все от незнания. Все на ощупь. Потому и задаю глупые вопросы. Предварительно, стараюсь искать ответы. Но, если уж совсем засада, спрашиваю.
    Я не сильно представляю себе архитектуру этого всего хозяйства. Кто на ком стоит Ява, Андроид, ХМЛ, Чтото надо руками указывать....
    Я программировал десктоп приложения с базами данных, там мне все понятно. А это поле пока что все в тумане.
    Не обессудьте за глупые вопросы. Просто Вам ответить походя, а мне многие часы и даже дни поиска ответа.

    Еще раз благодарю за помощь

    error.png

  10. 1 час назад, Hevard сказал:

    А почему у Вас диск F:\?

    Ставил и на системный диск, проблема та же. Это уже третий подход к Александрии. Поработаю немного в Сиднее, нахожу новую инструкцию по установке. Сношу и пытаюсь ставить 11.
    На системном лучше иметь свободное место, потому поставил на F:

    47 минут назад, krapotkin сказал:

    Надеюсь, вы сможете найти на своих дисках свой SDK

    Ну видимо село я, не асфальтированное... Ставил и SDK и JDK и NDK из разных источников и в разных ипостасях и с инсталеров и просто из архивов... Ничего из того , что просит RAD Studio в этих каталогах не нашел... В одном из пакетов был только adb.exe.
     

     

    50 минут назад, krapotkin сказал:

    и искать свой телефон там

    Винда телефоны прекрасно видит и файл менеджерами я спокойно их юзаю. Телефоны все в режиме разработчика и в режиме отладки по ЮСБ.

    Мне б убогому пошаговый букварь... Как установить, откуда взять...

  11. В 07.05.2023 в 15:36, krapotkin сказал:

    Если ваш телефон видится через ADB - он будет и в Делфи

    Я прошу прощения, я чайник в андроидах, и мобильных приложениях. Но, стоял Сидней 10.4 Все прекрасно видел, разные телефоны подключал, совсем дремучий Самсунг, ХТС, Ксяоми...
    Переставил 11.3 и вот такая картинка с SDK Пытался ставить по инструкциям с разных сайтов... Полные дрова.
    Может есть какойто пакет автоматом ставящий все это для андроида? Или вернуться все же к 10ке?

    SDK.png

  12. Программа под смартфон. На форме лежит Layout, на нем Image На картинке, посредине лежит Rectangle. Когда я пытаюсь вырезать из картинки участок ограниченный Rectangle, выходное изображение не соответствует границам и имеет искаженный масштаб. Ка можно привести это в норму?
     

    var
      bmpS, bmpD: TBitMap;
      iRectS: Trectf;
      HD, wD: integer;
      iRectD: Trectf;
       Scalex, scaley: real;
    begin
      Scalex := 1;
      scaley := 1;
      bmpS := imgCameraView.Bitmap;
      iRectS := Trectf.Create(TPointF.Create(Ramka.Position.X * Scalex,
        Ramka.Position.Y * scaley), TPointF.Create((Ramka.Position.X + Ramka.Width)
        * Scalex, (Ramka.Position.Y + Ramka.Height) * scaley));
    
      wD := Max(0, Round(Ramka.Width));
      HD := Max(0, Round(Ramka.Height));
    
      bmpD := TBitMap.Create(wD, HD);
      iRectD := Trectf.Create(0, 0, Ramka.Width, Ramka.Height);
      Code.Visible := True;
    
      if bmpD.Canvas.BeginScene then
        try
          bmpD.Canvas.DrawBitmap(bmpS, iRectS, iRectD, 1);
          bmpD.Canvas.EndScene;
          Code.Bitmap.assign(bmpD);
         finally
          bmpD.Free;
     
        end;

     

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