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

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


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?

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

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

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

  • 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

 

 

Ссылка на комментарий
  • 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

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

Всем доброго времени суток! Не могу победить замену стандартного звука в Delphi 10.3. Push реализовал штатными средствами, когда в параметрах проекта можно задать JSON с Firebase. Отредактировал  NotificationPublisher.java, заменил строку на .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM)), а звук все равно стандартный. Скачал архив FMX с поста выше, отредактировал пути, при запуске install.bat появляются два новых файла: classes.dex, fmx.jar. Их копирую в папку с проектом, в Deployment отключаю старый classes. Пробовал отключать fmx.dex.jar и добавлять fmx.jar. Пробовал не отключать а просто добавлять в папку fmx.jar. Результата нет, воспроизводится стандартный Push. Если использовать fmx.jar и classes.dex из поста выше приложение висит и не открывается. Папки из архива удалил, не понял их сути, там ссылки на прямой каталог студии. Файл NotificationPublisher.java прикрепил, там большие отличия от файлов старых версий. Push отправляю JSON из приложения ARC для Chrome.

{ "notification": {
   "title": "Проверка",
  "text": "Доставки",
  "icon":"ic_launcher",
  "color":"Green"
   },
  "data":{
  "sound":"alarm"},
   
     "to" : "Токен с FireBase"

Параметр Sound как только не отправлял и из notification, и из data. Но по идее при setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM)) должна воспроизводиться мелодия будильника, а не стандартного уведомления. 

 

У кого был такой опыт, что я делаю не так? Спасибо.

NotificationPublisher.zip

 

P.S. Вот инструкция по Push в 10.3 http://docwiki.embarcadero.com/RADStudio/Rio/en/Firebase_Android_Support

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

Есть продвижения. Изначально создавались classes.dex, fmx.jar но оказывается ява компилятор ругался, ему не нравились пути при запуске в параметрах из переменных. Прописал напрямую: %JAVA%\javac -d "%PROJ_DIR%" "%PROJ_DIR%\com\embarcadero\rtl\notifications\NotificationPublisher.java" -cp "F:\Program Files\Embarcadero\Studio\20.0\PlatformSDKs\android-sdk-windows\platforms\android-29\android.jar";"F:\Program Files\Embarcadero\Studio\20.0\lib\android\debug\android-support-v4.jar"

Теперь не может подключить библиотеки видимо, как ее добавить и в каком файле искать этот класс?

 


R:\fmx>я╗┐@echo off
"я╗┐@echo" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

R:\fmx>setlocal

R:\fmx>if x == x set ANDROID_SDK="F:\Program Files\Embarcadero\Studio\20.0\Platf
ormSDKs\android-sdk-windows"

R:\fmx>if x == x set JAVA="C:\Program Files\Java\jdk1.8.0_60\bin"

R:\fmx>set ANDROID_PLATFORM="F:\Program Files\Embarcadero\Studio\20.0\PlatformSD
Ks\android-sdk-windows"\platforms\android-29

R:\fmx>set DX_LIB="F:\Program Files\Embarcadero\Studio\20.0\PlatformSDKs\android
-sdk-windows"\build-tools\29.0.0\lib

R:\fmx>set EMBO_DEX="F:\Program Files\Embarcadero\Studio\20.0\lib\android\debug\
classes.dex"

R:\fmx>set FMX_JAR="F:\Program Files\Embarcadero\Studio\20.0\lib\android\debug\f
mx.jar"

R:\fmx>set PROJ_DIR="R:\fmx"

R:\fmx>echo COMPILLING NotificationPublisher.java
COMPILLING NotificationPublisher.java

R:\fmx>"C:\Program Files\Java\jdk1.8.0_60\bin"\javac -d ""R:\fmx"" ""R:\fmx"\com
\embarcadero\rtl\notifications\NotificationPublisher.java" -cp "F:\Program Files
\Embarcadero\Studio\20.0\PlatformSDKs\android-sdk-windows\platforms\android-29\a
ndroid.jar";"F:\Program Files\Embarcadero\Studio\20.0\lib\android\debug\android-
support-v4.jar"
R:\fmx\com\embarcadero\rtl\notifications\NotificationPublisher.java:17: error: p
ackage com.embarcadero.firemonkey does not exist
import com.embarcadero.firemonkey.FMXNativeActivity;
                                 ^
R:\fmx\com\embarcadero\rtl\notifications\NotificationPublisher.java:243: error:
cannot find symbol
            newIntent = new Intent(context, FMXNativeActivity.class);
                                            ^
  symbol:   class FMXNativeActivity
  location: class NotificationPublisher
R:\fmx\com\embarcadero\rtl\notifications\NotificationPublisher.java:307: error:
cannot find symbol
                ChannelsManager channelsManager = new ChannelsManager(context);
                ^
  symbol:   class ChannelsManager
  location: class NotificationPublisher
R:\fmx\com\embarcadero\rtl\notifications\NotificationPublisher.java:307: error:
cannot find symbol
                ChannelsManager channelsManager = new ChannelsManager(context);
                                                      ^
  symbol:   class ChannelsManager
  location: class NotificationPublisher
4 errors

R:\fmx>pause
Для продолжения нажмите любую клавишу . . .

 

Ссылка на комментарий
  • 0
В 23.10.2019 в 16:30, r@di0 сказал:

Так не работает?
setSound(Uri.parse("android.resource://" + this.mContext.getPackageName() + "/raw/sound"));
и добавить файл sound в Deployment (Remote Path: res\raw\)

Взял файл NotificationPublisher.java из архива, вроде скомпилировался. По крайней мере при распаковке fmx.jar там свежий NoificationPublisher.class

Но звук не меняется.

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

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

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

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

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

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

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

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

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

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