ionic - Как правильно изменить значок в плагине локальных уведомлений? - PullRequest
0 голосов
/ 26 декабря 2018

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

До сих пор я использовал два телефона для проверки этого,оба устройства Android: первый, Oreo (8.1.0) и другой, Nougat (7.0).Я использую Ionic CLI 4.5.0, и я знаю, что его оболочка не совместима с плагином, как указано в хранилище плагинов.

Я пробовал много путей для URI иконки, в соответствии счто этот ответ предложил, но, похоже, ничего не работает.

В провайдере это соответствующая часть кода:

declare var cordova: any;
...
// inside a function that takes "id", "nome" and "tempo" as parameters:
cordova.plugins.notification.local.schedule({
    id: id,
    title: nome,
    text: "Sua atividade agendada, \"" + nome + "\", está prestes a começar!",
    at: new Date(tempo),
    foreground: true,
    icon: 'res://icone-notif.png',
    smallIcon: 'res://icone-notif-24.png'
});

И в моем конфиге.xml, я добавил следующие строки:

<platform name="android">
    ...
    <resource-file src="resources/android/icon/icone-notif-24.png" target="res/icone-notif-24.png" />
    <resource-file src="resources/android/icon/icone-notif.png" target="res/icone-notif.png" />
</platform>

(я проверил каждый файл, и они правильно помещаются в папку "res" в моем проекте)

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

1 Ответ

0 голосов
/ 09 января 2019

Я долго боролся, и вот что я сделал, чтобы решить это:

Мое уведомление объявлено так:

const notification = {
    id: idNotif,
    text: this.getNotifText(notifs[0].type),
    trigger: {at: dateNotif},
    led: 'FF0000',
    smallIcon: 'res://ic_stat_notify.png',
    icon: 'res://icon.png',
    vibrate: true
};
this.localNotifications.schedule(notification);

В этом примере кода обратите внимание, чтоссылки на эти значки имеют префикс res://.Эти значки фактически находятся в папке platforms/android/app/src/main/res, которая автоматически генерируется при компиляции приложения (например, с ionic cordova run android).

Если вы хотите, чтобы уведомления работали, у вас должны быть следующие папкив этой папке res:

  • drawable-mdpi
  • drawable-hdpi
  • drawable-xhdpi
  • drawable-xxhdpi
  • drawable-xxxhdpi

Вам также необходим файл icon.png непосредственно в папке res, так как он упоминается как параметр icon в объявлении локального уведомления.

Папки соответствуют различным возможным размерам значков в Android , в зависимости от плотности пикселей.Вы можете найти больше об этом в справочнике icon .Когда уведомление будет запущено, правильный размер значка будет автоматически выбран из этих 5 возможных размеров.

Каждая из этих папок должна содержать файл ic_stat_notify.png, который должен быть значком в правильном формате:

  • drawable-mdpi: 24x24
  • drawable-hdpi: 36x36
  • drawable-xhdpi: 48x48
  • drawable-xxhdpi: 72x72
  • drawable-xxxhdpi: 96x96
  • icon.png: 96x96

Хорошо, но как мне поместить их в папку, которая создается только после компиляции?

Ответ таков: путем создания ловушки .

Поместите эти папки в папку, к которой вы можете получить доступ, и которая постоянно существует в вашем приложении.Лично я использовал resources/android/icon.

Затем создайте ловушку для копирования этих файлов в нужную папку при каждой компиляции приложения.

Вот мой ловушку icon_notif.js (примечание: это вдохновлено этим руководством ):

#!/usr/bin/env node

var filestocopy = [];
var filestocopyAndroid = [
    {
        "resources/android/icon/drawable-mdpi/ic_stat_notify.png":
        "platforms/android/app/src/main/res/drawable-mdpi/ic_stat_notify.png"
    },
    {
        "resources/android/icon/drawable-hdpi/ic_stat_notify.png":
        "platforms/android/app/src/main/res/drawable-hdpi/ic_stat_notify.png"
    },
    {
        "resources/android/icon/drawable-xhdpi/ic_stat_notify.png":
        "platforms/android/app/src/main/res/drawable-xhdpi/ic_stat_notify.png"
    },
    {
        "resources/android/icon/drawable-xxhdpi/ic_stat_notify.png":
        "platforms/android/app/src/main/res/drawable-xxhdpi/ic_stat_notify.png"
    },
    {
        "resources/android/icon/drawable-xxxhdpi/ic_stat_notify.png":
        "platforms/android/app/src/main/res/drawable-xxxhdpi/ic_stat_notify.png"
    },
    {
        "resources/android/icon/icon.png":
        "platforms/android/app/src/main/res/icon.png"
    }
];

var fs = require('fs');
var path = require('path');
var rootdir = './';
var androiddir = path.join(rootdir, "platforms/android");
var iosdir = path.join(rootdir, "platforms/ios");

if(fs.existsSync(androiddir)) {
    filestocopy = filestocopyAndroid;
    console.log("Android platform file recognized");
} else if(fs.existsSync(iosdir)) {
    console.log("iOS platform file recognized");
    filestocopy = filestocopyiOS;
} else {
    console.log("Error: no Android or iOS platform file was recognized.");
    filestocopy = [];
}

console.log("~~~~ Start Copying Notification Status Icons");
filestocopy.forEach(function (obj) {
    Object.keys(obj).forEach(function (key) {
        var val = obj[key];
        var srcfile = path.join(rootdir, key);
        var destfile = path.join(rootdir, val);
        console.log("copying: " + srcfile);
        console.log("     to: " + destfile);
        var destdir = path.dirname(destfile);
        if(!fs.existsSync(destdir)) {
            fs.mkdirSync(destdir);
        }
        if (fs.existsSync(srcfile) && fs.existsSync(destdir)) {
            fs.createReadStream(srcfile).pipe(
                fs.createWriteStream(destfile));
        }
    });
});
console.log("~~~~ End Copying Notification Status Icons");

По сути, этот скрипт копирует нужные папки во вновь сгенерированные platforms/android/app/src/main/res folder.

Пока этот хук работает правильно, все должно работать нормально!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...