Настройка значка уведомлений для Android с помощью Mixpanel

Используя Mixpanel, я могу отправлять уведомления прямо с их панели управления, однако в настоящее время в качестве значка уведомления используется странно обрезанная версия значка запуска.

Я видел несколько ответов по настройке значка с помощью настроенного BroadcastReceiver, но в этом случае я не могу заставить его работать. Кому-нибудь удалось изменить значок уведомления при отправке напрямую из Mixpanel?

Спасибо.


person user1544797    schedule 04.02.2015    source источник


Ответы (4)


На самом деле, есть способ установить собственный значок для push-уведомлений Android без написания собственного собственного приемника вещания. Последние версии библиотеки Android Mixpanel понимают параметр «mp_icnm», который может ссылаться на имя ресурса в вашем приложении. Сама библиотека также содержит набор предопределенных значков, которые вы можете использовать. Быстрый способ — поместить следующий фрагмент в поле «Пользовательские данные».

{"mp_icnm":"com_mixpanel_android_ic_megaphone"}

Я приложил скриншот приложения Mixpanel с изображением текстового поля. Вы должны быть уверены, что эти данные вводятся в режиме предварительного просмотра «Android», когда вы вводите свои данные, как показано на рисунке.

Иллюстрация пользовательского поля данных на экране компоновщика push-уведомлений Mixpanel, показывающая подходящее место для JSON выше

Вы можете использовать любой ресурс для рисования в своем приложении для значка — весь список предварительно упакованных значков уведомлений можно найти здесь, в библиотеке Mixpanel, а их имена ресурсов перечислены ниже.

  • com_mixpanel_android_ic_bell
  • com_mixpanel_android_ic_clipboard_checkmark
  • com_mixpanel_android_ic_coin
  • com_mixpanel_android_ic_flag
  • com_mixpanel_android_ic_gear
  • com_mixpanel_android_ic_inbox
  • com_mixpanel_android_ic_мегафон
  • com_mixpanel_android_ic_phone
  • com_mixpanel_android_ic_rocket
  • com_mixpanel_android_ic_sale_tag
  • com_mixpanel_android_ic_sync
  • com_mixpanel_android_ic_trophy
  • com_mixpanel_android_ic_vip
  • com_mixpanel_android_ic_warning

Имейте в виду, что ресурсы Mixpanel могут быть удалены вашей конфигурацией proguard, поэтому вы должны быть уверены, что не удалили их, если хотите их использовать.

person user128536    schedule 06.02.2015
comment
Планируется, что эта функция будет более полно поддерживаться в пользовательском интерфейсе в будущих версиях веб-приложения Mixpanel, но поддержка библиотеки уже запущена. - person user128536; 06.02.2015
comment
Сработало удовольствие, использовалось почти так же, как вы упомянули, {mp_icnm:ic_stat_noti_icon} просто изменил второй бит на мой собственный значок. - person user1544797; 10.02.2015
comment
привет я попробовал {mp_icnm:ic_stat_from_my_drawable} но не получилось почему работает мегафон - person Sheychan; 05.02.2016
comment
Шейчан - я не уверен, почему это не работает с вашим рисунком. Возможно, стоит прокомментировать проект Mixpanel Github по адресу github.com/mixpanel/mixpanel-android. - person user128536; 09.02.2016
comment
Я искал его в течение некоторого времени, так что, возможно, этот комментарий кому-то поможет: Чтобы использовать отображаемые имена приложений для значков с Proguard, в конфигурацию proguard необходимо добавить: -keep class ${APP_PACKAGE_ID}.R$drawable { *; } (где ${APP_PACKAGE_ID} – идентификатор пакета вашего приложения) - person Jansen; 02.11.2017

Чтобы ответить на один аспект вопроса @user1544797 и в дополнение к ответу @user128536, вы можете позволить своему приложению отвечать за настройку значка уведомления и не полагаться на режим предварительного просмотра Mixpanel. Для этого вы должны перехватить трансляцию Mixpanel, создав свой собственный BroadcastReceiver, который расширяет GCMReceiver Mixpanel:

public class MixpanelGCMReceiver extends GCMReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        intent.putExtra("mp_icnm", "<your_icon_name>");
        super.onReceive(context, intent);
    }

}

Затем объявите свой BroadcastReceiver в файле AndroidManifest.xml:

<receiver
  android:name="<your_package_name>.MixpanelGCMReceiver"
  android:permission="com.google.android.c2dm.permission.SEND">
  <intent-filter>
    <action android:name="com.google.android.c2dm.intent.RECEIVE" />
    <action android:name="com.google.android.c2dm.intent.REGISTRATION" />

    <category android:name="${applicationId}" />
  </intent-filter>
</receiver>

Наконец, @user128536 прав, предупреждая вас, что Proguard испортит ваш значок уведомления, если им не управлять должным образом (и, к сожалению, Mixpanel не документирует, как ваше приложение должно обрабатывать этот случай). Однако, помимо Proguard, есть еще одна проблема, которую вам, возможно, придется решить, если вы используете applicationId, который отличается от вашего packageName (обычно при использовании вариантов продукта). В классе ResourceReader из Mixpanel SDK вы можете увидеть этот комментарий:

MPLog.w(LOGTAG, "Can't load names for Android view ids from '" + localClassName + "', ids by name will not be available in the events editor.");
MPLog.i(LOGTAG, "You may be missing a Resources class for your package due to your proguard configuration, " +
                "or you may be using an applicationId in your build that isn't the same as the package declared in your AndroidManifest.xml file.\n" +
                "If you're using proguard, you can fix this issue by adding the following to your proguard configuration:\n\n" +
                "-keep class **.R$* {\n" +
                "    <fields>;\n" +
                "}\n\n" +
                "If you're not using proguard, or if your proguard configuration already contains the directive above, " +
                "you can add the following to your AndroidManifest.xml file to explicitly point the Mixpanel library to " +
                "the appropriate library for your resources class:\n\n" +
                "<meta-data android:name=\"com.mixpanel.android.MPConfig.ResourcePackageName\" android:value=\"YOUR_PACKAGE_NAME\" />\n\n" +
                "where YOUR_PACKAGE_NAME is the same string you use for the \"package\" attribute in your <manifest> tag."
);

Как указано в комментарии выше, если вы окажетесь в такой ситуации, просто добавьте в файл AndroidManifest.xml следующий блок:

<meta-data
  android:name="com.mixpanel.android.MPConfig.ResourcePackageName"
  android:value="<your_package_name>" />

Вот и все, вы должны быть готовы к этому моменту ;)

person ptitvinou    schedule 23.05.2017
comment
Мне нравится это решение, но я думаю, что мы не можем переопределить те значки, которые появятся на панели управления Mixpanel. - person Zohaib Akram; 25.01.2018

Кроме того, вы можете добавить маленькую иконку, которая будет отображаться в строке состояния.

"mp_icnm_w": "your_small_icon_id"

Он должен быть белым с прозрачным фоном.

person Алексей Юр    schedule 06.10.2016
comment
что вы имеете в виду под your_small_icon_id? Точно не тот номер? В противном случае, что произойдет, если он изменится - person kingston; 20.12.2016
comment
@kingston Я имею в виду идентификатор доступного ресурса (имя). FE: my_app_icon. - person Алексей Юр; 20.12.2016
comment
@kingston Что-то связанное с комментарием, невозможно отредактировать предыдущий. И если он не находит запрошенный ресурс, то рисует обведенный квадрат, если я правильно помню. - person Алексей Юр; 20.12.2016
comment
Я передаю свой идентификатор ресурса, но отображается только круглый значок. - person Mohit Rajput; 05.05.2020
comment
@MohitRajput вам не нужно передавать идентификатор ресурса. Вместо этого добавьте только имя без расширения. Пример: ic_launcher. mp_icnm_w: ic_launcher - person Tushar Pandey; 28.01.2021

Я даю этот ответ для всех людей, которые не могут найти идеальное решение даже после прочтения всех предыдущих ответов. Я суммирую все ключевые моменты, которые необходимы для отображения значка вашего приложения, когда вы получаете push-уведомление Mixpanel.

  1. Если вы используете ProGuard (в моем случае это был я), вам необходимо указать следующие настройки в файле Proguard Rule.

keepclassmembers class **.R$* {
    public static <fields>;
}

  1. Добавьте приведенный ниже код в файл Manifest.xml.

<meta-data
    android:name="com.mixpanel.android.MPConfig.ResourcePackageName"
    android:value="YOUR_PACKAGE_NAME" /> 

Это имя пакета (package="YOUR_PACKAGE_NAME"), объявленное в файле манифеста вашего приложения (например, YOUR_PACKAGE_NAME. Замените его фактическим значением имени пакета). Не путайте его с идентификатором приложения. Это не сработает, если вы укажете здесь свой идентификатор приложения.

Точки 1 и 2 также упоминаются внутри класса ResourceReader, как указано в одном из приведенных выше ответов.

MPLog.w(LOGTAG, "Can't load names for Android view ids from '" + localClassName + "', ids by name will not be available in the events editor.");
MPLog.i(LOGTAG, "You may be missing a Resources class for your package due to your proguard configuration, " +
                "or you may be using an applicationId in your build that isn't the same as the package declared in your AndroidManifest.xml file.\n" +
                "If you're using proguard, you can fix this issue by adding the following to your proguard configuration:\n\n" +
                "-keep class **.R$* {\n" +
                "    <fields>;\n" +
                "}\n\n" +
                "If you're not using proguard, or if your proguard configuration already contains the directive above, " +
                "you can add the following to your AndroidManifest.xml file to explicitly point the Mixpanel library to " +
                "the appropriate library for your resources class:\n\n" +
                "<meta-data android:name=\"com.mixpanel.android.MPConfig.ResourcePackageName\" android:value=\"YOUR_PACKAGE_NAME\" />\n\n" +
                "where YOUR_PACKAGE_NAME is the same string you use for the \"package\" attribute in your <manifest> tag."
);

  1. Если вы уже используете FCMPushReceiver и хотите интегрировать поддержку уведомлений Mixpanel, следуйте приведенным рекомендациям здесь.

Независимо от того, используете ли вы MixpanelFCMMessagingService или FirebaseMessagingService, вам нужно поместить код ниже в секцию onMessageReceived().

/* drawable_name is just the Drawable Name like if you app logo is app_icon, 
   use "app_icon" instead of "R.drawable.app_icon" */
if (TextUtils.isEmpty(intent.getStringExtra("mp_icnm"))) {
    intent.putExtra("mp_icnm", "drawable_name"); // mp_icnm is used for the app icon
}
if (TextUtils.isEmpty(intent.getStringExtra("mp_icnm_l"))) {
    intent.putExtra("mp_icnm_l", "drawable_name"); // mp_icnm_l is used for the large icon
}
if (TextUtils.isEmpty(intent.getStringExtra("mp_icnm_w"))) {
    intent.putExtra("mp_icnm_w", "drawable_name"); // mp_icnm_w is used for the White icon
} 

Для получения дополнительной информации о параметрах, используемых Mixpanel, вы можете проверить метод parseIntent класса MixpanelPushNotification.

В случае MixpanelFCMMessagingService вы можете получить намерение в параметре метода. Для FirebaseMessagingService вы можете получить намерение, выполнив следующие действия:

final Intent intent = remoteMessage.toIntent();
person Abhishek    schedule 24.08.2020