Перейти к содержанию
  • Регистрация
  • 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?

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

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


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

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

  • 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 свой звук подбрасывается норм. На Андроиде скорее всего печаль

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


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

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

Вот измененная процедура, ну и добавил вытягивание параметра 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

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


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

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

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

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

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

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

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

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

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


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

    • От FREEFAR
      Всем доброго времени суток. 
      Казалось бы. Во время разработки и перед тем как подписали приложение сертификатом Distribution, пуши приходили норм. Но после того как прошли аудит Apple пуши куда-то пропали. FCM возвращал ошибку InvalidRegistration.
      Оказалось все достаточно просто. На сервере с которого мы отправляем пуш, В php скрипте, который отправляет пуши надо выставить
      sandbox = false
      Ура! Всем удачи)
    • От 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



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

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

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