• 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?

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

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


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

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

  • 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

 

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


Ссылка на сообщение
Поделиться на другие сайты
  • 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

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


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

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

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

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

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

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

Войти

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

Войти


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

    • От 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
  • Последние посетители   0 пользователей онлайн

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