• 0
Savage

Изменение стандартного звука а push-уведомлении

Вопросы

Здравствуйте!

Второй день не получается поменять стандартный звук в 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?

Может есть готовое решение?

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


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

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

  • 0

Нашел место, отвечающее за не правильную реализацию звука в NotificationPublisher.java

private Builder buildNotification(String msgTitle, String msgText, PendingIntent contentIntent) {
        int icon = this.mContext.getApplicationContext().getApplicationInfo().icon;
        Builder mBuilder = new Builder(this.mContext);
        mBuilder.setSmallIcon(icon);
        mBuilder.setTicker(msgTitle);
        mBuilder.setContentTitle(msgTitle);
        mBuilder.setContentText(msgText);
        mBuilder.setContentIntent(contentIntent);
        mBuilder.setSound(RingtoneManager.getDefaultUri(2));
        return mBuilder;
    }

Виноват mBuilder.setSound(RingtoneManager.getDefaultUri(2));

буду править и пересобирать fmx.jar

 

 

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


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

на iOS свой звук подбрасывается норм. На Андроиде скорее всего печаль

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


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

Задачу решил.

Вот измененная процедура, ну и добавил вытягивание параметра sound

    private Builder buildNotification(String msgTitle, String msgText, String msgSound, PendingIntent contentIntent) {
        int icon = this.mContext.getApplicationContext().getApplicationInfo().icon;
        Builder mBuilder = new Builder(this.mContext);
        mBuilder.setSmallIcon(icon);
        mBuilder.setTicker(msgTitle);
        mBuilder.setContentTitle(msgTitle);
        mBuilder.setContentText(msgText);
        mBuilder.setContentIntent(contentIntent);
// savage
        if (msgSound == "") {
           mBuilder.setSound(RingtoneManager.getDefaultUri(2));
        }
        else
        {
          mBuilder.setSound(Uri.parse("android.resource://" + this.mContext.getPackageName() + "/raw/"+msgSound));
        }
//
        return mBuilder;
    }

Звуковой файл надо добавить в Deployment

Расположение res/raw/

При формировании push-сообщения имя файла указывается без расширения. К примеру, если звуковой файл был event1.mp3, то в пуше посылаем "sound":"event1"

 

Во вложении патченый файл.

Сборка fmx.jar и classes.dex как в этой теме

 

NotificationPublisher.zip

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


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

Добавил многострочность в PUSH-уведомление

Надо или нет пересобирать classes.dex точно не скажу. Говорят, что на 10.2.3 не надо :)

Вначале просто подбросить в проект fmx.jar , если изменений нет, то и classes.dex

 

NotificationPublisher.zip

Изменено пользователем Savage

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


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

При компиляции NotificationPublisher.java выходят ошибки:

Compiling the Java service activity source files

warning: [options] bootstrap class path not set in conjunction with -source 1.7
src\NotificationPublisher\NotificationPublisher.java:12: error: package android.support.v4.app.NotificationCompat does not exist
import android.support.v4.app.NotificationCompat.Builder;
                                                ^
src\NotificationPublisher\NotificationPublisher.java:13: error: package android.support.v4.app does not exist
import android.support.v4.app.NotificationCompat;
                             ^
src\NotificationPublisher\NotificationPublisher.java:122: error: package NotificationCompat does not exist
    private  NotificationCompat.Builder buildNotification(String msgTitle, String msgText, String msgSound, PendingIntent contentIntent) {
                               ^
src\NotificationPublisher\NotificationPublisher.java:115: error: package NotificationCompat does not exist
        NotificationCompat.Builder builder = buildNotification(msgTitle, msgText, msgSound, PendingIntent.getActivity(context, i, newIntent, 134217728));
                          ^
src\NotificationPublisher\NotificationPublisher.java:124: error: cannot find symbol
        Builder mBuilder = new NotificationCompat.Builder(this.mContext);
        ^
  symbol:   class Builder
  location: class NotificationPublisher
src\NotificationPublisher\NotificationPublisher.java:124: error: package NotificationCompat does not exist
        Builder mBuilder = new NotificationCompat.Builder(this.mContext);
                                                 ^
src\NotificationPublisher\NotificationPublisher.java:130: error: package NotificationCompat does not exist
        mBuilder.setStyle(new NotificationCompat.BigTextStyle().bigText(msgText));
                                                ^
7 errors
1 warning

вот bat-файл для компиляции

@echo off

setlocal
 
if x%ANDROID% == x set ANDROID=C:\Users\Public\Documents\Embarcadero\Studio\19.0\PlatformSDKs\android-sdk-windows
set ANDROID_PLATFORM=%ANDROID%\platforms\android-27
set PROJ_DIR=%CD%
set VERBOSE=0

echo %ANDROID%
echo %ANDROID_PLATFORM%
echo %PROJ_DIR%
 
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\NotificationPublisher\NotificationPublisher.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, which is output\jar\test_classes.jar
 
:Exit
 
pause
 
endlocal

 

PS. Ошибка была в том, что был неверен путь к ANDROID_SDK в bat-файле.

 

Изменено пользователем Rusland

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


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

Надо подключать еще  android-support-v4.jar

Вот мои файлы

компиляция

"C:\Program Files\Java\jdk1.8.0_60\bin\javac" -source 1.8 -target 1.8 "R:\fmx\com\embarcadero\rtl\notifications\NotificationPublisher.java" -cp "C:\Program Files (x86)\Android\android-sdk\platforms\android-17\android.jar";"C:\Program Files (x86)\Embarcadero\Studio\19.0\lib\android\debug\android-support-v4.jar" -d "r:\fmx"
pause

 

сборка

 

echo off

setlocal


set JAVA="C:\Program Files\Java\jdk1.8.0_60\bin"
set ANDROID_PLATFORM="C:\Program Files (x86)\Android\android-sdk\platforms\android-17"
set DX_LIB="C:\Program Files (x86)\Android\android-sdk\build-tools\27.0.3\lib"
set EMBO_DEX="C:\Program Files (x86)\Embarcadero\Studio\19.0\lib\android\debug\classes.dex"
set FMX_JAR="C:\Program Files (x86)\Embarcadero\Studio\19.0\lib\android\debug\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
pause

:Exit

endlocal

 

FMX.zip

Изменено пользователем Savage
добавил инфо о подключении android-support-v4.jar

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


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

В версии Берлин есть свои особенности.
1. Берём берлиновские java-исходники: C:\Program Files (x86)\Embarcadero\Studio\18.0\source\rtl\androiddex\java\fmx\src\
Далее в файле NotificationPublisher.java в buildNotification правим код, чтобы использовался переданный параметр Sound (если передан):

if (msgSound == "") { //если не передан, используем стандартный звук уведомлений
	mBuilder.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));
} else {
	mBuilder.setSound(Uri.parse("android.resource://" + this.mContext.getPackageName() + "/raw/" + msgSound));
}

Подключаете класс import android.net.Uri;
Прокидываете параметр String msgSound выше до publishGCM, а в publishGCM нужно получить из бандла параметр Sound по аналогии с другими параметрами (см. приложенный файл NotificationPublisher.java).
Можете так же прописать mBuilder.setStyle(new NotificationCompat.BigTextStyle().bigText(msgText)); для MultiLine сообщений и сразу сделать обработку параметра icon для использования в пушах иконок отличных от иконки приложения.
2. После того как Вы воссоздали структуру нужного пакета (в java иерархия классов определяется вложенностью папок) в нужном каталоге и внесли необходимые изменения в исходники, необходимо откомпилировать измененные классы, добавить их в исходный пакет (fmx.jar) и сформировать файл classes.dex (cм. приложенный файл install.bat):

@echo off

setlocal

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

echo COMPILLING NotificationPublisher.java
%JAVA%\javac -d "%PROJ_DIR%" "%PROJ_DIR%\com\embarcadero\rtl\notifications\NotificationPublisher.java" -cp "%ANDROID_PLATFORM%\android.jar";"C:\Program Files (x86)\Embarcadero\Studio\18.0\lib\android\debug\android-support-v4.jar"
pause
echo COPY ORIGINAL fmx.jar
copy %FMX_JAR% %PROJ_DIR%\fmx.jar"
echo UPDATE FILE NotificationPublisher.class
%JAVA%\jar uf "fmx.jar" com\embarcadero\rtl\notifications\NotificationPublisher.class
echo CONVERTING FROM jar TO dex
call %DX_LIB%\dx.jar --dex --verbose --output=%PROJ_DIR%\output\dex\test_classes.dex --positions=lines %PROJ_DIR%\fmx.jar
echo MERGING dex FILES
mkdir output\dex 2> nul
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%
del output\dex\test_classes.dex
echo Now we have the end result, which is output\dex\classes.dex

pause

:Exit

endlocal

Поправьте PROJ_DIR на свой каталог, в котором всё лежит (у меня в C:\fmx), а так же проверьте правильность остальных путей.
3. После того как Вы получили новый пакет fmx.jar, а так же файл classes.dex, оба файла необходимо скопировать в каталог со своим Delphi-проектом.
4. Добавьте новый файл classes.dex в Deployment и отключите старый файл classes.dex;
5. У нового файла classes.dex пропишите Remote Path как у старого файла (classes\);
6. Добавьте звуковой(ые) файл(ы) для уведомлений в Deployment и пропишите Remote Path: res\raw\
На этом подготовка IDE завершена. Что-либо отключать в IDE в разделе Libraries (напр. fmx.dex.jar) не требуется. Добавлять так же ничего не требуется.
Если Вы ранее подключали свой fmx.dex.jar, то удалите его и включите стандартный.
7. При отправке Push с сервера параметр Sound передавать не в Notification!, а в Data:
$fields['data'] = array('body' => $text, 'title' => $title, 'sound' => 'neworder');
Имя звукового файла указывается без расширения.

fmx.zip

Изменено пользователем r@di0
Поправил орфографические ошибки

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


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

Дополнение: иногда нужно, чтобы уведомления не накапливались, а отображалось только последнее. Поправил класс NotificationPublisher (см. аттач), чтобы при наличии в данных параметра "unique": false обновлялось последнее сообщение, а не добавлялись новые.

NotificationPublisher.zip

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


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

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

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

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

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

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

Войти

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

Войти

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

    • От 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 и какие сертификаты использовать не могу понять. Кто занимался похожем вопросом? Поделитесь знаниями.
      Спасибо
    • От Равиль Зарипов (ZuBy)
      Доброго дня!
      Решил я побороть проблемку single-line в нотификациях (в частности push, т.к. локальные можно выводить в несколько строк)
      Почитал в интернете, набрел на такие статьи 
      https://mobilefirstplatform.ibmcloud.com/blog/2015/11/24/multi-line-gcm-push-notifications/ https://github.com/vivinkrishnan/multi-line-push/blob/master/MultiLineNotifications/apps/MultiLineNotifications/android/native/src/com/MultiLineNotifications/GCMIntentService.java судя по ним нужно просто подменить библиотеку com.embarcadero.gcm.notifications.GCMIntentService на измененную как статье выше
      Вроде плёвое дело, но где найти эту библиотеку и чем скомпилировать исходник?
      Если у кого есть познания в этой области, подскажите в какую сторону рыть. Нам ведь всем такое пригодится
       

      fmx.zip (Seattle, Berlin)                                                                     LocalMultiline.zip (Berlin)
      https://github.com/rzaripov1990/Multiline-Push-and-Local-Notifications
    • От master webs
      P.S.//  приложение никаких изменений не потерпело  код рабочий и проверенный на версиях 10/10,1 berlin
      http://alexbirukov.ru/?go=all/php-server-dlya-rassylki-push-na-android-i-ios/ 
      исходники на github https://github.com/master-webs/ios-push-FCM-delphi
      в серверной части изменил регистрацию устройства в нашей базе .
      GCM практически ни чем не отличается от FCM  как описал гугл в FCM больше возможностей и он рекомендует перейти на его использование.
      Приложения Delphi 10/10.1  Android также успешно проходят регистрацию через поставщиков услуг (GCM) и на сколько я понял гугл совместимость не будет прикрывать для работоспособности приложений которые уже не обновляют в плеймаркете. Интерфейс на мой взгляд стал намного проще и удобнее с консоли можно спокойно отправлять групповые  и адресные оповещения.
      Что касается возможности отправки оповещений на IOS устройства. Доступно много примеров и библиотек практически для каждой среды разработки кроме (продуктов embarcadero)
      покопавшись в документации нашол статью которая дала понять как переригестрировать токены ios  и получить токен FCM.
      сделал следующе  ios получивший токен спешит зарегистрировать девайс  на вашем сервере скрипт перехватывает и делает регистрацию на серверах гугла  и новый токен мы также записываем в свою базу
      в архиве прикрепляю серверную часть php сделана она чисто для тестирования и  я не рекомендую использовать как рабочий вариант хотя  до рабочего варианта там допилить совсем не много.
      Ниже прикрепляю скрины  лк FCM 
      push.zip



    • От Anasazi
      Есть объект APushService:TPushService, при запуске приложения с помощью окна пуш-уведомления пытаюсь сделать, чтобы текст уведомления отображался в showmessage. У APushService есть свойство StartupNotifications, но тип System.TArray. Подскажите пожалуйста, вывести значение StartupNotifications на экран?

  • Последние посетители   0 пользователей онлайн

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