pythonkivykivymd

Python3+Kivy+Plyer Push notification icon problem


I've a weird error using a simple notification testing app using android.

The error:

python  :  AttributeError: type object 'notification.org.notificator.R$drawable' has no attribute 'icon'

The python file:

import kivy
from kivymd.app import MDApp
from kivymd.uix.screen import MDScreen
from kivy.lang import Builder
from plyer import notification
from kivy.uix.screenmanager import ScreenManager


class NotificationScreen(MDScreen):
    def do_notify(self, mode='fancy'):
        title = self.ids.notification_title.text
        message = self.ids.notification_text.text
        ticker = self.ids.ticker_text.text
        app_ico = 'Images/icon.png'

        notification.notify(app_icon=app_ico, title=title, message=message, ticker=ticker, timeout=10)
        #notification.notify(app_icon='Images/icon.ico', title=title, message=message, ticker=ticker, timeout=10)
        #notification.notify(title=title, message=message, ticker=ticker, timeout=10)


class ScreenManagement(ScreenManager):
    pass


view = Builder.load_file('main.kv')


class NotificationDemoApp(MDApp):
    def build(self):
        return view


if __name__ == '__main__':
    NotificationDemoApp().run()

The KV file:

ScreenManagement:
    id: scrm
    NotificationScreen:
        scrm: scrm

<NotificationScreen>:
    notification_title: notification_title
    notification_text: notification_text
    ticker_text: ticker_text
    MDBoxLayout:
        orientation: 'vertical'
        md_bg_color: 0, 0, 0, 1
        MDBoxLayout:
            orientation: 'horizontal'
            size_hint: 1, None
            md_bg_color: 1, 1, 1, 1
            TextInput:
                id: notification_title
                text: 'Put title here'
                size_hint: 1, None
            TextInput:
                id: notification_text
                text: 'Put message here'
                size_hint: 1, None
            TextInput:
                id: ticker_text
                text: 'New notification'
                size_hint: 1, None
        Button:
            text: 'Toast Notification'
            size_hint: 1, None
            on_release: root.do_notify(mode='toast')
        Button:
            text: 'Simple Notification'
            size_hint: 1, None
            on_release: root.do_notify(mode='normal')
        Button:
            text: 'Fancy Notification'
            size_hint: 1, None
            on_release: root.do_notify(mode='fancy')

The basic uncommented lines of buildozer:

[app]
title = Notification Example
package.name = notificator
package.domain = notification.org
source.dir = .
requirements = python3,kivy==2.0.0rc4,requests,kivymd,pillow,urllib3,charset_normalizer,idna,plyer
icon.filename = %(source.dir)s/icon.png

I've tryed to change the icon to .ico ( have both on the Images directory ) and still the same issue. Also tryed to remove the app_icon arg from the notify() function and still the same issue. Also tryed to put the icons into the root directory and same issue.

Please, I've been looking for an answer but didn't find anything useful on the net. Any tip or solution ? Thx


Solution

  • I had the same problem and found the problem and a workaround, not the solution though:

    The problem lies within the Drawable Object created in the file plyer/platforms/android/notification.py. If you print(dir(Drawable)), you will find no attibute icon (as the error message stated). I don't know why the icon attribute is missing, but you will find there is a presplash attribute instead (which is also a .png file and thus replaceable).

    By changing line 100 in the notification.py from app_icon = Drawable.icon to app_icon = Drawable.presplash, I could dodge the error and my app worked perfectly well. You need to change the line in the correct file though, which is located at ProjectName/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/projectname/plyer/platforms/android.