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

Вопрос

  • Модераторы

Доброго дня!

Решил я побороть проблемку single-line в нотификациях (в частности push, т.к. локальные можно выводить в несколько строк)

Почитал в интернете, набрел на такие статьи 

судя по ним нужно просто подменить библиотеку com.embarcadero.gcm.notifications.GCMIntentService на измененную как статье выше

Вроде плёвое дело, но где найти эту библиотеку и чем скомпилировать исходник?

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

 

Screenshot_20160705-111159.pngScreenshot_20160708-151511.png

fmx.zip (Seattle, Berlin)                                                                     LocalMultiline.zip (Berlin)

https://github.com/rzaripov1990/Multiline-Push-and-Local-Notifications

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

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

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

Нашел на форуме в одной из тем Java Decompiler

им посмотрел fmx.jar в нем лежит, то что нужно

2016-07-01_12-06-52.png

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

вставил нужную строчку

/* 115:    */   private NotificationCompat.Builder buildNotification(String msgTitle, String msgText, PendingIntent contentIntent)
/* 116:    */   {
/* 117:129 */     int icon = this.mContext.getApplicationContext().getApplicationInfo().icon;
/* 118:    */     
/* 119:    */ 
/* 120:    */ 
/* 121:133 */     NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this.mContext);
/* 122:134 */     mBuilder.setSmallIcon(icon);
/* 123:135 */     mBuilder.setTicker(msgTitle);
/* 124:136 */     mBuilder.setContentTitle(msgTitle);
/* 125:137 */     mBuilder.setContentText(msgText);
/* 126:138 */     mBuilder.setContentIntent(contentIntent);
/* add:ZuBy */    mBuilder.setStyle(new NotificationCompat.BigTextStyle().bigText(msgText)); // эта строчка делает мультилайн
/* 127:139 */     mBuilder.setSound(RingtoneManager.getDefaultUri(2));
/* 128:    */     
/* 129:141 */     return mBuilder;
/* 130:    */   }

на всякий случай прикладываю полностью исходные данные

остался вопрос, как скомпилировать в jar файл? 

fmx.src.rar

Изменено пользователем ZuBy
Ссылка на комментарий
  • 0
  • Модераторы
6 часов назад, ZuBy сказал:

остался вопрос, как скомпилировать в jar файл? 

Как-то так Creating a JAR File, ещё вспомните про classes.dex, там промежуточно компилится jar файл, живой пример создания jar файла и использования команды из справки.

Ссылка на комментарий
  • 0
  • Модераторы
2 минуты назад, Andrey Efimov сказал:

Как-то так Creating a JAR File, ещё вспомните про classes.dex, там промежуточно компилится jar файл, живой пример создания jar файла.

там не сколько jar, а нужно все java файлы откомпилировать. как это сделать?

Ссылка на комментарий
  • 0
  • Модераторы
11 минуту назад, ZuBy сказал:

там не сколько jar, а нужно все java файлы откомпилировать. как это сделать?

По ссылке же есть пример

jar cvf TicTacToe.jar TicTacToe.class audio images

TicTacToe.jar - это наш файл

TicTacToe.class audio images - это файлы, которые будут помещены в jar\

 

p.s. или я вас опять неправильно понял...

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

решим откомпилировать только один файл, который изменял

javac -source 1.7 -target 1.7 "E:\fmx\com\embarcadero\rtl\notifications\NotificationPublisher.java" -cp "C:\Program Files (x86)\Embarcadero\Studio\17.0\lib\android\release\android-19.jar" -d "e:\fmx"

ошибки 

Цитата

warning: [options] bootstrap class path not set in conjunction with -source 1.7
E:\fmx\com\embarcadero\rtl\notifications\NotificationPublisher.java:11: error: package android.support.v4.app.NotificationCompat does not exist
/*  11:    */ import android.support.v4.app.NotificationCompat.Builder;
                                                              ^
E:\fmx\com\embarcadero\rtl\notifications\NotificationPublisher.java:115: error: package NotificationCompat does not exist
/* 115:    */   private NotificationCompat.Builder buildNotification(String msgTitle, String msgText, PendingIntent contentIntent)
                                          ^
E:\fmx\com\embarcadero\rtl\notifications\NotificationPublisher.java:108: error: package NotificationCompat does not exist
/* 108:120 */     NotificationCompat.Builder builder = buildNotification(msgTitle, msgText, contentIntent);
                                    ^
E:\fmx\com\embarcadero\rtl\notifications\NotificationPublisher.java:121: error: package NotificationCompat does not exist
/* 121:133 */     NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this.mContext);
                                    ^
E:\fmx\com\embarcadero\rtl\notifications\NotificationPublisher.java:121: error: package NotificationCompat does not exist
/* 121:133 */     NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this.mContext);
                                                                              ^
E:\fmx\com\embarcadero\rtl\notifications\NotificationPublisher.java:127: error: package NotificationCompat does not exist
                                                 mBuilder.setStyle(new NotificationCompat.BigTextStyle().bigText(msgText));
                                                                                         ^
6 errors
1 warning

import android.support.v4.app.NotificationCompat.Builder; из библиотеки android-support-v4.jar

он не может найти класс который хранится в другой библиотеке, но как две библиотеки указать, чтобы он компилил и с android-19.jar и android-support-v4.jar

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

 

10 минут назад, Andrey Efimov сказал:

Файлы указываются через точку с запятой


...\release\android-19.jar";след. файл

 

надо наверно набросать софтинку по генерации, чтобы не вручную и всё по-русски было :)

Ссылка на комментарий
  • 0
  • Модераторы
46 минут назад, Andrey Efimov сказал:

Файлы указываются через точку с запятой

хорошо, теперь все видит но ошибки остаются

cls&javac -source 1.7 -target 1.7 "E:\fmx\com\embarcadero\rtl\notifications\NotificationPublisher.java" -cp "C:\Program Files (x86)\Embarcadero\Studio\17.0\lib\android\release\android-19.jar";"C:\Program Files (x86)\Embarcadero\Studio\17.0\lib\android\release\android-support-v4.jar" -d "e:\fmx"

ошибки

Цитата

warning: [options] bootstrap class path not set in conjunction with -source 1.7
E:\fmx\com\embarcadero\rtl\notifications\NotificationPublisher.java:115: error: package NotificationCompat does not exist
/* 115:    */   private NotificationCompat.Builder buildNotification(String msgTitle, String msgText, PendingIntent contentIntent)
                                          ^
E:\fmx\com\embarcadero\rtl\notifications\NotificationPublisher.java:108: error: package NotificationCompat does not exist
/* 108:120 */     NotificationCompat.Builder builder = buildNotification(msgTitle, msgText, contentIntent);
                                    ^
E:\fmx\com\embarcadero\rtl\notifications\NotificationPublisher.java:121: error: package NotificationCompat does not exist
/* 121:133 */     NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this.mContext);
                                    ^
E:\fmx\com\embarcadero\rtl\notifications\NotificationPublisher.java:121: error: package NotificationCompat does not exist
/* 121:133 */     NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this.mContext);
                                                                              ^
E:\fmx\com\embarcadero\rtl\notifications\NotificationPublisher.java:127: error: package NotificationCompat does not exist
                                                 mBuilder.setStyle(new NotificationCompat.BigTextStyle().bigText(msgText));
                                                                                         ^
5 errors
1 warning

вот теперь  я ничего не понимаю:

  • библиотеки видит - все отлично
  • код не трогал, добавил только одну строку

почему ошибки выходят?

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

откомпилил файл вот так

cls&javac -d "c:\users\ZuBy" "NotificationPublisher.java" -cp "android-19.jar";"android-support-v4.jar"

потом просто заменил в jar архиве файл NotificationPublisher.class на новый (незнаю, правильно или нет)

так делать не правильно, пробовал такой командой (источник)

cls&jar uf fmx.jar "com.embarcadero\rtl\notifications\NotificationPublisher.class"

ошибок не выдаёт, но файл имеет не правильную иерархию 2016-07-04_14-17-32.png   а вот так должно быть 2016-07-04_14-19-09.png

уже незнаю что делать

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

вот батник на исполнение с генерацией classes.dex (в идеале)

@echo off

setlocal

if x%ANDROID_SDK% == x set ANDROID_SDK="C:\Users\Public\Documents\Embarcadero\Studio\17.0\PlatformSDKs\android-sdk-windows"
if x%JAVA% == x set JAVA="C:\Program Files\Java\jdk1.8.0_66\bin"
set ANDROID_PLATFORM=%ANDROID_SDK%\platforms\android-23
set DX_LIB=%ANDROID_SDK%\build-tools\23.0.3\lib
set EMBO_DEX="C:\Program Files (x86)\Embarcadero\Studio\17.0\lib\android\release\classes.dex"
set FMX_JAR="C:\Program Files (x86)\Embarcadero\Studio\17.0\lib\android\release\fmx.jar"
set PROJ_DIR=%CD%
set VERBOSE=0

echo.
echo COPY ORIGINAL fmx.jar
copy %FMX_JAR% %PROJ_DIR%\fmx.jar"

echo.
echo UPDATE FILE NotificationPublisher.class
%JAVA%\jar uf "fmx.jar" "com.embarcadero\rtl\notifications\NotificationPublisher.class"

echo.
echo CONVERTING FROM jar TO dex
mkdir output\dex 2> nul
if x%VERBOSE% == x1    SET VERBOSE_FLAG=--verbose
call %DX_LIB%\dx.jar --dex %VERBOSE_FLAG% --output=%PROJ_DIR%\output\dex\test_classes.dex --positions=lines %PROJ_DIR%\fmx.jar

echo.
echo MERGING dex FILES
echo.com.android.dx.merge.DexMerger
java -cp %DX_LIB%\dx.jar com.android.dx.merge.DexMerger %PROJ_DIR%\output\dex\classes.dex %PROJ_DIR%\output\dex\test_classes.dex %EMBO_DEX%

echo.
del output\dex\test_classes.dex
del output\jar\test_classes.jar
rmdir output\jar

echo.
echo Now we have the end result, which is output\dex\classes.dex

:Exit

endlocal
  1. распаковать архив 
  2. проверить пути к java, android sdk, delphi

что не работает: обновление JAR файла (с оригинальным fmx.jar все генерируется)

directory.rar

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

У меня всё сработало, внёс одно изменение (не считая изменений в путях sdk)

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

com.embarcadero\rtl\notifications\NotificationPublisher.class

Должно быть

com\embarcadero\rtl\notifications\NotificationPublisher.class

и соответственно папка embarcadero должна лежать в папке com.

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

несколько дней убили с Андреем (Andrey Efimovна решение этой задачи

За что ему большое спасибо, он доделал до рабочего варианта

вот результат

Screenshot_20160705-111159.png

использовать fmx.zip

  • скопировать fmx.dex.jar в папку с проектом
  • далее по картинке
  • компилируем
  • и ждём пуш

2016-07-05_11-17-08.png

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

Жалко, что смог только сейчас подключиться к теме.

Спасибо большое за ваше решение!

Если говорить о больших Notifications, хотелось бы не просто весь текст всех уведомлений читать на экране, а разворачивать только те, что заинтересовали. Т.е. сделать у себя расширяемые и управляемые (с кнопками) уведомления. И хотелось бы, делать это без импорта дополнительных JAVA классов, если уж Embarcadero предоставляет нам возможность делать мосты, а Android SDK содержит все необходимые классы.

К сожалению, я завис на своем проекте, и не могу сейчас предоставить готовый PAS код. Но вот, с чего бы я начал в первую очередь:

1. Взял пример работы с GSM из \Embarcadero\Studio\18.0\source\rtl\common\System.Android.Notification.pas;

2. Использовал порт \Embarcadero\Studio\18.0\source\rtl\android\Androidapi.JNI.Support.pas или выдернул последний из SDK

Цитата

\PlatformSDKs\android-sdk-windows\sources\android-23\android\app\

\PlatformSDKs\android-sdk-windows\sources\android-23\android\service\notification\

\PlatformSDKs\android-sdk-windows\sources\android-23\com\android\systemui\statusbar\

\PlatformSDKs\android-sdk-windows\sources\android-23\com\android\systemui\statusbar\phone\

3. Изучил готовые примеры на Java, которые используют bigText и setAction;

4. Сделал бы свой Unit (компоненты я не научился пока хорошо делать) для работы с Big Smart Notifications (название сам придумал).

 

Удачи в этом. Ваши исследования очень полезны для нас.

 

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

И хотелось бы, делать это без импорта дополнительных JAVA классов, если уж Embarcadero предоставляет нам возможность делать мосты, а Android SDK содержит все необходимые классы.

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

С пушами (те что генерит GCM) обстоит немного иначе, тут именно нужен java код и правки в классе который публикует нотификации.

При реализации расширенных уведомлении, нужно будет библиотеку писать под каждый отдельный проект (что в принципе и правильно)

А это решение универсальное, который даёт пользователям просматривать полный текст и разработчикам "свободу слова"

Цитата

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

это кстати так и работает,

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

Ссылка на комментарий
  • 0
В 05.07.2016 в 08:19, ZuBy сказал:

использовать fmx.zip

  • скопировать fmx.dex.jar в папку с проектом
  • далее по картинке
  • компилируем
  • и ждём пуш

2016-07-05_11-17-08.png

Не пойму что делать с этим fmx.dex.jar, как его засунуть в Libraries?

Можете приложить готовый проект?

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

Libraries->ПКМ->Add->выбираем файл

*Тестировал на сиетле

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

Добавил... не компилируется проект (в Берлине)... пишет 

Цитата

[Exec Error] The command "PATH C:\Program Files\Java\jdk1.8.0_45\bin;...Android\Debug\fmx.dex-dexed.jar"" exited with code 2.

 

Изменено пользователем Rusland
Ссылка на комментарий
  • 0
17 минут назад, Rusland сказал:

Добавил... не компилируется проект (в Берлине)... пишет 

 

у меня все в берлине прошло успешно  ошибка была  пока не отключил дефолтный dex

Ссылка на комментарий
  • 0
  • Модераторы
2 минуты назад, Rusland сказал:

Действительно, надо было отключить дефолтный fmx.dex.jar (по картинке не понял). Для обычного Notification этот метод не сработает?

Нет, но могу выложить решение для локальных нотификации

Ссылка на комментарий
  • 0
26 минут назад, Rusland сказал:

Для обычного Notification этот метод не сработает?

Писал выше, посмотри эти примеры:

Цитата

3. Изучил готовые примеры на Java, которые используют bigText и setAction;

Тут показано, как просто отправить многострочное уведомление без компонента.

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

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

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

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

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

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

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

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

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

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