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

Rusland

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

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

  • Посещение

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

    26

Активность репутации

  1. Like
    Rusland получил реакцию от Равиль Зарипов (ZuBy) в [Статья][Android] Как получить информацию о потреблении ОЗУ?   
    Хотелось бы еще статью про физическую память устройства 
  2. Like
    Rusland отреагировална Andrey Efimov в [Статья][Android] Как получить информацию о потреблении ОЗУ?   
    Я подумаю над этой темой.
  3. Like
    Rusland отреагировална Andrey Efimov в [Статья][Android] Как получить информацию о потреблении ОЗУ?   
    Ссылка: http://delphifmandroid.blogspot.ru/2017/03/blog-post.html
    Автор: Ефимов Андрей
    Описание:
  4. Like
    Rusland отреагировална ENERGY в [Статья] Жизненный цикл объектов в Delphi. Часть 1. Windows, OSX. Что же использовать Destroy, Free, FreeAndNil или DisposeOf?   
    Спасибо Ярослав!
    Есть еще одна статья от GunSmoker на эту тему. Там есть ряд интересных ньюансов, которые не описаны у Ярослава и о которых многие не знают.
    К примеру то, что DisposeOf хотя и вызывает деструктор, но не освобождает память выделенную под объект.. 
     
  5. Like
    Rusland отреагировална AliZairov в Куда сохранять настройки и данные Android-приложения?   
    Hi. SharedPreferences
    uses Androidapi.Helpers, Androidapi.JNI.App, Androidapi.JNI.JavaTypes, Androidapi.JNI.GraphicsContentViewText; var SP: JSharedPreferences; SPE: JSharedPreferences_Editor; procedure TMain.FormShow(Sender: TObject); begin SP := TAndroidHelper.Activity.getSharedPreferences(StringToJString('ZTApp'), 0); IP.Text := JStringToString(SP.getString(StringToJString('IP'), StringToJString('127.0.0.1'))); end; procedure TMain.SaveClick(Sender: TObject); begin SPE := SP.edit; SPE.putString(StringToJString('IP'), StringToJString(IP.Text)); SPE.commit; end;  
  6. Like
    Rusland отреагировална Равиль Зарипов (ZuBy) в Куда сохранять настройки и данные Android-приложения?   
    1) сохранять нужно в TPath.GetDocumentsPath
    2) Нужно будет снова запросить, явно там есть такая возможность
  7. Like
    Rusland отреагировална ENERGY в Куда сохранять настройки и данные Android-приложения?   
    Это спорный момент. При написании мултиплатформенной программы, в Windows -  GetDocumentsPath вернет  c:\Users\<username>\Documents\ . Пользователь может удалить оттуда данные случайно - т.к. это папка "Мои документы".
    Лучше TPath.GetHomePath\имя программы - напр. для Adobe в Windows это c:\Users\<username>\AppData\Roaming\Adobe\
    Для андроида GetHomePath и GetDocumentsPath вернут одинаковый путь. В MacOS, iOS и Windows - это разные пути.
    Здесь  описание всех путей.
    + Для андроида 
    GetDocumentsPath; - /data/data/com.myapp.app1/files GetDownloadsPath; - /storage/emulated/0/Android/data/com.myapp.app1/files/Download GetHomePath; - /data/data/com.myapp.app1/files GetSharedDocumentsPath; - /storage/emulated/0/Android/data/com.myapp.app1/files GetLibraryPath; - /data/data/com.myapp.app1/files GetPublicPath; - /storage/emulated/0/Android/data/com.myapp.app1/files GetPicturesPath; - /storage/emulated/0/Android/data/com.myapp.app1/files/Pictures Ну и кто еще не в курсе - сохранять удобней всего в TMemIniFile из юнита IniFiles. Реестра в Unix системах нет (а это MacOS, iOS и Android), там все на файлах.
  8. Like
    Rusland отреагировална Andrey Efimov в Остановить таймер, когда приложение сворачивается   
    Очередь событий Delphi приложения на Android Жизненный цикл мобильного приложения
  9. Like
    Rusland отреагировална ENERGY в OnItemClick vs OnGesture   
    Надо было назвать тему TListView OnItemClick и Long Tap, т.к. для остальных гестур все работает.
    А что если использовать OnTap и определять по координатам текущий Item?
  10. Like
    Rusland отреагировална AliZairov в CrossVCL Beta XE3-Berlin   
    Hi. New tools for Delphi IDE. Using CrossVcl you focus only on your VCL application and CrossVcl makes it cross-platform.
    This is beta software only for testing purpose. CrossVcl on early stage of development, what are to test in this release:

    * Installation process (CrossVcl creates copy and patches existing on your machine Vcl and Rtl sources, all original sources stay unmodified)
    * Upgrading simple or new Vcl project to macOS (Right Click on Project in Project Inspector)
    * Compilation and deploying of simple project

    Please do not create bug-report if you can't compile or launch big Vcl projects or any third-party controls at this stage.

    Bug reports and suggestions welcome at:
    https://bitbucket.org/crossvcl/crossvcl/issues

    We help you on:
    http://stackoverflow.com/questions/tagged/crossvcl

    Google+:
    https://plus.google.com/109334532832375082802

    Facebook:
    https://www.facebook.com/crossvcl

    Twitter:
    https://twitter.com/VclCross
    Home
  11. Like
    Rusland отреагировална Евгений Корепов в ListView Item.Height   
    To hide individual item is better to use the filtering feature TListView.ListViewFilter(Sender: TObject; const AFilter,  AValue: string; var Accept: Boolean);
  12. Like
    Rusland отреагировална ENERGY в Частичная прозрачность   
  13. Like
    Rusland отреагировална enatechno в Рисование маршрута на MapView, Delphi, Android   
    Button1.StaysPressed := true; procedure TForm1.Button1Click(Sender: TObject); begin if Button1.IsPressed then ShowMessage('нажата') else ShowMessage('отжата'); end;  
  14. Like
    Rusland отреагировална Евгений Корепов в OnUpdateObjects OnUpdatingObjects в Берлине   
    Похоже я все победил! Вот код который отлично работает без костылей:
    function SetupTextObject(const AName, AText : String; AWidth, AHeight, X , Y : Single; AAlign, AVertAlign: TListItemAlign; ATextAlign, ATextVertAlign: TTextAlign) : TListItemText; begin Result:=TListItemText(AItem.View.FindDrawable(AName)); if Result=Nil then begin Result:=TListItemText.Create(AItem); Result.Name:=AName; Result.Width:=AWidth; Result.Text:=AText; Result.PlaceOffset.X:=X; Result.PlaceOffset.Y:=Y; Result.Align:=AAlign; Result.VertAlign:=AVertAlign; Result.TextAlign:=ATextAlign; Result.TextVertAlign:=ATextVertAlign; if AHeight=-1 then begin if FListViewItemTextHeigh=-1 then begin // Ищем стилевой объект 'font' в ListView и присобачиваем его к нашему итему AFontObject:=(AListView.FindStyleResource('font') as TFontObject); if Assigned(AFontObject) then Result.Font.Assign(AFontObject.Font); FListViewItemTextHeigh:=GetTextHeight(Result, AWidth, AText); Result.Height:=FListViewItemTextHeigh; end else Result.Height:=FListViewItemTextHeigh; end else Result.Height:=AHeight; Result.Visible:=True; end; end; До применения шрифта из стиля Result.Font.Size=12, после Result.Font.Assign(AFontObject.Font) значение размера меняется на 18 - теперь высота рассчитывается корректно.
  15. Like
    Rusland отреагировална Евгений Корепов в OnUpdateObjects OnUpdatingObjects в Берлине   
    Я наступил на те же грабли что и уважаемый HyperZen. Причем наступал я на эти грабли много раз раз, в каждой версии Delphi.
    Малюсенькое исправление решает проблему:
    function SetupTextObject(const AName, AText : String; AWidth, AHeight, X , Y : Single; AAlign, AVertAlign: TListItemAlign; ATextAlign, ATextVertAlign: TTextAlign) : TListItemText; begin Result:=TListItemText(AItem.View.FindDrawable(AName)); if Result=Nil then begin Result:=TListItemText.Create(AItem); Result.Name:=AName; Result.Width:=AWidth; //********************************************************* Result.Font.Size:=Result.Font.Size + 0.01; // Вот этот костыль заставляет все работать как задуманно. //********************************************************* Result.Text:=AText; Result.PlaceOffset.X:=X; Result.PlaceOffset.Y:=Y; Result.Align:=AAlign; Result.VertAlign:=AVertAlign; Result.TextAlign:=ATextAlign; Result.TextVertAlign:=ATextVertAlign; if AHeight=-1 then begin if FListViewItemTextHeigh=-1 then // Так как везде один шрифт, то вычисляем высоту текста однократно begin FListViewItemTextHeigh:=GetTextHeight(Result, AWidth, AText); Result.Height:=FListViewItemTextHeigh; end else Result.Height:=FListViewItemTextHeigh; end else Result.Height:=AHeight; end; end; Проблема в старинном глюке эмбаркадеровского ListView - вычисление высоты текста на этапе создания, или позднее не имеет смысла, потому как размер шрифта по умолчанию (обычно 12), перед отрисовкой превратиться во все что угодно, но не в 12, стиль применит свой размер шрифта и ваши расчеты высоты итема можно будет выкинуть. Победить глюк можно только установкой своего размера (обязательно отличного от 12 - цифра 12 "мудро" используется ембаркадерой как флаг означающий что можно применить стиль.
    Помню что задавал здесь этот вопрос не раз, но так и не получил ответа - как узнать размер шрифта из стиля, а не из FontSize????????????????!!!!!!!!!!!!!! Только с размерами шрифта из стиля имеет смысл расчитывать высоту.
    Даже в стандартых примерах эмбаркадыры этот скользкий момент старательно обходится и внимание на нем не концентрируется. Вот пример \Studio\18.0\Samples\Object Pascal\Multi-Device Samples\User Interface\ListView\VariableHeightItems:
    Drawable.Font.Size := 1; // Ensure that default font sizes do not play against us Drawable.Font.Size := 10 + Random(4) * 4; они делают хитро, вместо стандартный 12 пишут 1, а потом уже вписывают нужные значения. Если закомментировать эти две строчки (или написать Drawable.Font.Size := 12), то пример перестает работать, текст режется.
  16. Like
    Rusland отреагировална Andrey Efimov в Настройки IDE Delphi   
  17. Like
    Rusland отреагировална Кривяков Виталий в [Статья] Как конвертировать растровую картинку в векторный TPath Firemonkey. How to convert a bitmap image (png, jpeg, bmp) into a Firemonkey vector TPath.   
    Добрый день!
    Коллеги, хочу озвучить одну из причин, из-за которой может возникать ситуация " Иногда бывает что при вставке пути в TPath, компонент его отображает некорректно"
    Дело в том, что существуют сокращения в представлении данных и не все из низ TPath понимает, вот с чем столкнулся:
    Есть команда 'c' - рисование кривой. не буду вдаваться в подробности, можно найти в интернете описание, скажу только то, что данная команда содержит 6 чисел. В идеале должно быть:
    сX1 X2 X3 X4 X5 X6
    Но очень часто (например в иконках Material Design) можно встретить:
    c-1.1 0-1.99.9-1.99 2
    И на этой строчке парсер TPath падает с ошибкой, так как пытается сконвертировать '-1.99.9' в число, что не верно. В реальности данная запись соответствует двум числам -1.99 и 0.9.
     
    Для обхода проблемы я загружаю SVG в рантайме, и сроку пропускаю через корректор:
    function CorrectSVG(const Value: String): String; var SB : TStringBuilder; I: Integer; C : Char; begin SB := TStringBuilder.Create; try I := 0; for C in Value do begin if C='.' then Inc(I) else if not CharInSet(C, ['0'..'9']) then I := 0; if I=2 then begin SB.Append(' 0.'); I := 0; end else SB.Append(C); end; Result := SB.ToString; finally FreeAndNil(SB); end; end;  
  18. Like
    Rusland отреагировална ENERGY в [Статья] Как конвертировать растровую картинку в векторный TPath Firemonkey. How to convert a bitmap image (png, jpeg, bmp) into a Firemonkey vector TPath.   
    Как конвертировать растровую картинку в векторный TPath Firemonkey.
    How to convert a bitmap image (png, jpeg, bmp) into a Firemonkey vector TPath. Manual.

    Плюсы векторных изображений: 
    Можно изменять размер избражения в любую сторону, уменьшать и увеличивать, без потери качества. Картинка всегда будет с четкими краями, без размытия по краям и квадратиков. Можно легко изменять в RunTime цвет заливки и обводной рамки, изменяя цвета в полях Fill и Stroke компонента TPath. Заливка как правило одна - это цвет из свойства Fill Color. Но ... цвет может быть и градиентом из множества цветов, который можно указать в диспетчере объектов, там же можно загрузить и Bitmap как текстуру в качестве заливки.  Можно анимировать изображение, изменяя вышеуказанные свойства, а также направление градиента, размер, толщину обводной линии итд. Тоже можно менять и для Stroke свойства - обводной рамки.
    Минусы:
    Получаемое изображение упрощенное. Т.к. оно может содержать только один путь (Path) и одну плоскость.
    Возможно получиться скомбинировать множества TPath, положив их друг на друга с прозрачностью. 
    Векторное изображение вычисляется и рисуется "в живую", поэтому потребуется больше ресурсов, чем при отрисовке обычных растровых картинок png, jpg, bitmap.
    Что означает нагрузку на аппаратную часть, замедление работы программы и более быструю разрядку мобильного устройства.
    Поэтому если и использовать подобные векторные изображения, то в случае если нужно отобразить большие картинки-символы на разных экранах (не иконки) - например на маленьком экране телефона, и на большом планшете и на еще большем Desktop экране. 
    Хотя в примере \Samples\Object Pascal\Multi-Device Samples\User Interface\CustomListBox\CustomListBox.dproj используется векторная иконка\чекбокс очень простая. 
     
    Преимущества векторного изображения наглядно:

     
    Ингредиенты: 
    1. Векторный редактор, я взял бесплатный inkscape, который можно скачать здесь . 
    2. Картинка. Желательно чтобы картинка была с большим разрешением, от 300px и больше. Если взять изображение маленького размера, например 48x48 или 64x64, то контуры получатся не такими точными. И хотя inkscape все равно применит сглаживание контуров, и квадратиков вы не увидите, обводные линии могут получиться другой формы, к примеру более жирными или могут слиться с другими линиями.
    Исходное изображение лучше брать в формате PNG, т.к. JPEG оставляет артефакты в виде точек, в итоге программа при трассировке может захватить и их, что не желательно. Конечно же если другого исходника нету, то смысла конвертировать jpg в png нет - качество не улучшится.
    Основной метод конвертации - это трассировка изображения, - когда алгоритм ищет края и обводные линии, и на основе их рисует свои. Потому качественные результаты получаться если брать изображение с одной плоскостью, без теней, градиентов и деталей, в стиле Windows 8\10 или Android. Т.н. Flat (плоский) icon. 
    3. IDE RAD Studio Delphi или С++

    Приступим. 
    Запускаем incscape. 
    Размер исходной png картинки 668x720.

    1. Меню File > Open - указываем путь. Иконка загрузилась.
    2. Нажимаем левой кнопкой мыши на картинку, чтобы она выделилась.
    3. Меню Path > Trace Bitmap. Сразу выберите чекбокс Live Preview (см скриншот).
    Здесь есть разные методы, но нам нужна секция Single Scan: Creates a Path. Методы нужно подбирать визуально, "на глаз". 
    Можно также использовать и секцию Multiply Scans, а затем скомбинировать пути в один (Path > Combine), т.к. нам нужен один путь, и один набор. Путь (Path) это набор инструкций о том как и сколько рисовать линий-векторов. Для нашего конкретного случая, этой конкретной иконки, оптимальный вариант Color Quantization и количество цветов = 2.

     
    4. Нажимаем OK и закрываем окно. Появилось наше изображение залитое черным цветом - это и есть наша векторная картинка. 
    Стоит заметить что прямо под ним лежит наше исходного изображение. Чтобы его удалить нужно отодвинуть мышкой векторное изображение, выделить исходную картинку и удалить ее клавишей Delete.  
    5. Вы можете отредактировать пути, выбрав в левой панели инструмент Edit Paths By nodes (F2) или добавить фильтры\эффекты в меню Path > Path Effects. В данном примере я ничего не менял.
    6. File Save As > inkscape SVG .
    7. Открываем полученный SVG файл в блокноте или в Lister тотал коммандера. Ищем массив чисел, который обычно начинается со строчки "<path". Находим эту строчку, нам нужно набор символов, который идет после буквы "d=", к примеру d="m 397.33334,c -48.1 ...-0.326 -1.64129,-0.66405 z" и копируем все, что внутри кавычек в буфер.
    8. Далее в RAD IDE кидаем на форму TPath. В Object Inspector WrapMode устанавливаем в Fit, и в поле Data вставляем из буфера наш код.
    9. Меняем Fill и Stroke цвета на нужные нам значения (здесь я установил желтый цвет и увеличил толщину обводки (Stroke)). 

     
    Еще пару примеров. 
    Дерево - параметры Brightness Cutoff, Threshold 0.370 . Как видите здесь оптимальнее подходит метод Brightness Cutoff.  Здесь исходная png картинка - это дерево черного цвета, я ее распознал, и затем добавил в TPath, а в свойстве Fill указал градиент от черного до зеленого.
    Наушники - Edge Detection 0. Конечно конкретно в этом случае нужно подчищать изображение.

     

    Иногда бывает что при вставке пути в TPath, компонент его отображает некорректно, если снова зайти в DATA TPath, то окажется что часть данных потеряна. 
    Что исправить эту ситуацию, нужно путь упростить. Это значит что после шага 4, нужно выбрать в incscrape меню Path > Simplify, затем снова сохранить файл. 
    Правда Simplify в incscrape работает не очень хорошо, часто загругляет прямые участки. Лучше делать Simplify в Adobe Illustrator.
     
    Статья опубликована на сайте fire-monkey.ru и возможно будет изменяться и дополняться.
    Автор: ENRGY  
    24. 02. 17 
     
  19. Like
    Rusland получил реакцию от Ingalime в Дублирование проекта на телефоне   
    Да, будет две папки
  20. Like
    Rusland отреагировална ENERGY в Как определить что программа была запущена из AlarmManager? Или how to read boolean from intent   
    Тот же вопрос на http://stackoverflow.com/questions/42368123/how-to-pass-boolean-or-integer-to-intent-and-read-it-to-detect-that-my-activi
    Никакие свои аргументы добавлять из Java кода (putExtra) не нужно. Решение использовать счетчик EXTRA_ALARM_COUNT: 
    uses Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText; ... var Intent: JIntent; ... Intent := TAndroidHelper.Activity.getIntent; if Intent.getIntExtra(TJIntent.JavaClass.EXTRA_ALARM_COUNT, 0) > 0 then lblInfo.Text := 'Started by Alarm Manager through FMX Activity';  
    И насчет отправки аргумента при помощи putExtra из Java кода, все работает, просто я протупил, и регистрировал вызов своего активити напрямую (без Broadcast receiver), из примера номер 2 из из этой статьи .
    Кстати заодно я узнал что могу вместо Dex подключить Jar файл (начиная с XE7!), и это тоже работает, и гораздо проще! И кстати для примера номер 2 из той статьи (вызов активити напрямую - не нужен ни Dex файл, ни Jar ни манифест). Проверял на новом проекте.
     
  21. Like
    Rusland отреагировална ENERGY в [Статья][Android] AlarmManager - Автозапуск приложения в назначенное время   
    Большое спасибо что поддерживаете статьи в актуальном состоянии!
    Я также часто ссылаюсь на ваши статьи на других сайтах  - англоязычных.  Что удивительно подобная информация редко вcтречается на англоязычных сайтах, к примеру про Alarm Manager и Delphi нет ни одной статьи, даже на сайте Embarcadero этот вопрос долгое время висел без ответа, пока я не дал ссылку на вашу статью.
    Непопулярность Delphi Mobile как раз и связана с тем, кроме цены, что на многие вопросы почти нет ответов, при этом Java сообщество пестрит готовыми Copy Paste решениями, что увеличивает и без того большую армию пользователей. Но Java нет на iOS. И на Java не сделаешь кроссплатформенный проект с единым кодом и GUI, поэтому Delphi здесь на шаг впереди.
    Поэтому мне и показалось важным указать на ньюанс с JAR в темах связанными с DEX (заодно кстати и осветили баг с батником, помните javac -source 1.7 -target 1.7? - ведь на этом этапе у человека изучающего Delphi может пропасть желание изучать дальше),  столько плясок с бубном с этим dex, и разбросать чтобы больше людей увидели более удобный и простой вариант.
  22. Like
    Rusland отреагировална Andrey Efimov в [Статья][Android] AlarmManager - Автозапуск приложения в назначенное время   
    По поводу "как подключать JAVA класс":
    процитирую ответ в блоге:
    По поводу
    Цитата из ответа в блоге:
    Расчёт был на то, что читатель хотя бы поинтересуется в официальной справке, что делают два этих метода. К слову, по названию методов уже понятно, для чего каждый из них предназначен.
    Но раз есть один прецедент, то может быть и второй. Поэтому я уже добавил прямое указание различий у двух примеров.
     
    p.s. Не нужно заниматься кросспостингом.
     
    Update. Все три статьи обновлены. Конкретно в этой статье постарался объяснить в тексте поверхностные отличия двух примеров, которые мне, до сегодняшнего дня казались очевидными.
    Чуть позже выложу ещё всё на ГитХаб, чтобы не терялось
  23. Like
    Rusland отреагировална ENERGY в [Статья][Android] AlarmManager - Автозапуск приложения в назначенное время   
    Привет.
    Я тут узнал что оказывается начиная с XE7 не нужно создавать Dex файл затем подменять его на classes.dex.
    Достаточно создать Jar файл и подключить его к проекту. 
    Я проверил на новом проекте - все прекрасно работает. Проект автозапускается из AlarmManager (делал на основе этой статьи ) .А Dex файлы нужны для XE5 и XE6. Узнал я это из этого вопроса на stackoverflow.
    Пожалуйста Вы не могли бы обновить статью? Просто дописав эту заметку? На мой взгляд это важно.
    Я также обновил бат файл, 
    он будет примерно такой:
    @echo off setlocal   if x%ANDROID% == x set ANDROID=c:\Users\Alex\Documents\Embarcadero\Studio\18.0\PlatformSDKs\android-sdk-windows set ANDROID_PLATFORM=%ANDROID%\platforms\android-24 set PROJ_DIR=%CD% set VERBOSE=0   echo. echo Compiling the Java service activity source files echo. mkdir output 2> nul mkdir output\classes 2> nul if x%VERBOSE% == x1 SET VERBOSE_FLAG=-verbose javac -source 1.7 -target 1.7 %VERBOSE_FLAG% -Xlint:deprecation -cp %ANDROID_PLATFORM%\android.jar -d output\classes src\com\TestReceiver\AlarmReceiver.java echo. echo Creating jar containing the new classes echo. mkdir output\jar 2> nul if x%VERBOSE% == x1 SET VERBOSE_FLAG=v jar c%VERBOSE_FLAG%f output\jar\test_classes.jar -C output\classes com echo. echo Now we have the end result, in directory output\jar\ pause  
     
     
    Также еще один ньюанс.  Для варианта 2 никакой Dex файл не нужен. Также не нужен и Jar файл. 
    Также ничего не нужно в манифест добавлять, т.к. вызывается activity напрямую, без BroadcastReceiver.
    Но это только для варианта 2. Для первого варианта (Broadcast) все это нужно.

    Я проверял на новом проекте с вариантом 2 - все работает. 
  24. Like
    Rusland отреагировална ENERGY в [Статья][Android] Приложение будильник. Использование AlarmManager в FireMonkey на Андроиде   
    Т.е. звонит будильник и человек останавливает и откладывает его на 10 мин?
    Нужно автозапускать свое Activity как расписано в этой статье и просто устанавливать новый интервал в AlarmManager. 
    Кстати, начиная с XE7 вместо генерации Dex  и подмены classes.dex можно просто подключить Jar файл. Надеюсь Ярослав осветит это в своей статье (заодно там bat файл нужно обновить, он не работает на новых версиях java).
  25. Like
    Rusland отреагировална ENERGY в [Статья][Android] Приложение будильник. Использование AlarmManager в FireMonkey на Андроиде   
    Привет.
    Я тут узнал что оказывается начиная с XE7 не нужно создавать Dex файл затем подменять его на classes.dex.
    Достаточно создать Jar файл и подключить его к проекту.  
    А Dex файлы нужны для XE5 и XE6. Узнал я это из этого вопроса на stackoverflow.
    Пожалуйста Вы не могли бы обновить статью? Просто дописав эту заметку? На мой взгляд это важно.
    Я также обновил бат файл, 
    он будет примерно такой:
    @echo off setlocal   if x%ANDROID% == x set ANDROID=c:\Users\Alex\Documents\Embarcadero\Studio\18.0\PlatformSDKs\android-sdk-windows set ANDROID_PLATFORM=%ANDROID%\platforms\android-24 set PROJ_DIR=%CD% set VERBOSE=0   echo. echo Compiling the Java service activity source files echo. mkdir output 2> nul mkdir output\classes 2> nul if x%VERBOSE% == x1 SET VERBOSE_FLAG=-verbose javac -source 1.7 -target 1.7 %VERBOSE_FLAG% -Xlint:deprecation -cp %ANDROID_PLATFORM%\android.jar -d output\classes src\com\TestReceiver\AlarmReceiver.java echo. echo Creating jar containing the new classes echo. mkdir output\jar 2> nul if x%VERBOSE% == x1 SET VERBOSE_FLAG=v jar c%VERBOSE_FLAG%f output\jar\test_classes.jar -C output\classes com echo. echo Now we have the end result, in directory output\jar\ pause
×
×
  • Создать...