Вопросы

Доброго дня!

Решил я побороть проблемку 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
Поправил заголовок

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

52 ответа на этот вопрос

  • 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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
2 минуты назад, Rusland сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
Только что, ZuBy сказал:

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

Было бы хорошо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
Только что, Rusland сказал:

Было бы хорошо

Как только доберусь до компа, скину

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
26 минут назад, Rusland сказал:

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

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

Цитата

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Похожий контент

    • От Savage
      Здравствуйте!
      Второй день не получается поменять стандартный звук в push-уведомлении на свой.
      Сделал все по мануалу Гугла,  https://developers.google.com/cloud-messaging/http-server-ref
      Добавил звуковые файлы в проект в нужное место (/res/raw/ )
      Пуши летают, но звук стандартный. Такое впечатлеие, что com.embarcadero.gcm.notifications.GCMIntentService  просто игнорирует параметр sound
      Посмотрел при помощи LogCat
      В конечном итоге, в NotificationService прилетает уже дефолтный звук.
      04-05 23:03:34.172 V/NotificationService(1143): enqueueNotificationInternal: pkg=com.savage.pushtest id=4 notification=Notification(pri=0 contentView=null vibrate=null sound=content://settings/system/notification_sound defaults=0x0 flags=0x0 color=0x00000000 vis=PRIVATE)
      Неужели копать только в сторону правок com.embarcadero.gcm.notifications.GCMIntentService?
      Может есть готовое решение?
    • От Rusland
      Приложение свернуто или закрыто.
      Отправляю один пуш, на телефоне в шторке появляется уведомление.
      Отправляю еще один, появляется второе уведомление и так далее. Сколько пушей, столько и уведомлений.
      Как сделать чтобы все уведомления собирались в одном уведомлении в шторке? (как делают telegram, whatsapp и т. п.)
    • От Евгений Корепов
      Наткнулся тут на изящную штуку для приложения с PUSH уведомлениями на Android и Ios. Один объект, все сам делает.
      Внедрил в одно боевое приложение с 100+ тысячами установок, полет нормальный.
      Описание тут https://delphiworlds.com/2017/04/firebase-cloud-messaging-android-ios/
      Исходный код с примером на гитхабе https://github.com/DelphiWorlds/PushClient
      Использование максимально простое:
      uses DW.PushClient; .... private FPushClient: TPushClient; procedure PushClientChangeHandler(Sender: TObject; AChange: TPushService.TChanges); procedure PushClientReceiveNotificationHandler(Sender: TObject; const ANotification: TPushServiceNotification); .... procedure TFormMain.InitPushService; begin FPushClient := TPushClient.Create; FPushClient.GCMAppID := ConstGCMAppID; FPushClient.ServerKey := ''; FPushClient.BundleID := ''; FPushClient.UseSandbox := Debug; // Change this to False for production use! FPushClient.OnChange := PushClientChangeHandler; FPushClient.OnReceiveNotification := PushClientReceiveNotificationHandler; try FPushClient.Active := True; except SendError('FPushClient.Active Exception'); end; end; procedure TFormMain.PushClientChangeHandler(Sender: TObject; AChange: TPushService.TChanges); begin if TPushService.TChange.DeviceToken in AChange then begin HDevicePushParams.DeviceID:=FPushClient.DeviceID; HDevicePushParams.DeviceToken:=FPushClient.DeviceToken; GetHTTP(CommandRegisterFCM); // Memo1.Lines.Add('DeviceID = ' + FPushClient.DeviceID); // Memo1.Lines.Add('DeviceToken = ' + FPushClient.DeviceToken); end; end; procedure TFormMain.PushClientReceiveNotificationHandler(Sender: TObject; const ANotification: TPushServiceNotification); begin // ShowMessage(ANotification.DataObject.ToString... end; Правда руки не дошли разобраться для чего ему 
        FPushClient.ServerKey := '';
        FPushClient.BundleID := '';
      Но и без этого работает.
       
    • От Равиль Зарипов (ZuBy)
      Ссылка: http://blog.rzaripov.kz/2017/02/firebase-android-ios-2.html
      Автор: Зарипов Равиль @ZuBy
      Описание: Настройка пуш уведомлении через сервис Firebase для ANDROID и IOS [Часть 2]
      В предыдущей  части , я рассказывал как сделать настройку пуш уведомления в консоли Firebase, в этой я покажу код на Delphi и серверную часть на PHP
      https://github.com/rzaripov1990/PUSHTestFCM
    • От Равиль Зарипов (ZuBy)
      Ссылка: http://blog.rzaripov.kz/2017/02/firebase-android-ios.html
      Автор: Зарипов Равиль @ZuBy
      Описание: Настройка пуш уведомлении через сервис Firebase для ANDROID и IOS
    • От dmokrushin123
      На устройство с IOS сообщения приходят и через Kinvey и через FCM (Firebase Cloud Messaging).
      На Android возвращается Token, сами уведомления НЕ приходят. 
       
       
       
       
       
       
    • От Кривяков Виталий
      Добрый день!
      Возникла необходимость отправлять уведомления в стороннюю программу. Да не абы как через сертификаты, о чем много тут статей, а через токены.

      Немного руководства от яблока.
      Нашел библиотеку для работы с JWT
      https://github.com/paolo-rossi/delphi-jose-jwt
      Но вот как подписывать токен алгоритмом  ECDSA и какие сертификаты использовать не могу понять. Кто занимался похожем вопросом? Поделитесь знаниями.
      Спасибо
    • От ENERGY
      Привет.
      Про программировании в Windows, использовать Windows API просто -
      1. Открываем MSDN, находим нужную функцию.  Смотрим из какой она DLL.
      2. Затем портируем описание в Delphi,  LoadLibrary и вызов нужной фукнции.
       
      А вот как это сделать на Андроиде, я так и не понял. Я понял что есть обертки, но нужно научиться это делать самому. Кстати многие вопросы и существует здесь из за того, что народу не понятно как это сделать. Нигде нету толкового объяснения, с примером.
      Например я нашел статью где описывается обертка в Wifi, подскажите пожалуйста как сделать точно так же  пошагово.
      Например для класса WifiInfo
      1. https://developer.android.com/reference/android/net/wifi/WifiInfo.html читаем документацию.
      2. Что делать дальше?
  • Последние посетители   0 пользователей онлайн

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