displaying images from device on screen

685 views
Skip to first unread message

purushottam yadav

unread,
Mar 29, 2021, 1:03:10 PM3/29/21
to Kivy users support
I  used this function below callback_1(self)  to display images on the screen  but the problems are  :
1) screen is not changing immediately  , it is taking some time to change the  screen   and 
2) the images displayed are in random order  , but I want them to be in same order as in the device .
This code works good with no delay to change the screen  when images in the  device are less , but once the number of images are in hundred(874 in  my device) , I face 1st problem.
2nd problem  I am facing every time .

=========================simplified code========
    def callback_1(self):
        self.help_str.get_screen('imagepick').manager.current = 'imagepick'

        print("vertical dots clicked")
        print(Window.size)
        self.help_str.get_screen('imagepick').ids.imagegridlist.clear_widgets()

        for root, dirs, files in os.walk(str(storagepath.get_pictures_dir())): 
            for file in files:
                if(file.endswith(".jpeg"))  or (file.endswith(".png")) :
                    
                    ss =  str(os.path.join(root,file))
                 
                   
                    I = Piccollect(source = ss )
                    self.help_str.get_screen('imagepick').ids.imagegridlist.add_widget(I)
                    


<Imagepicscreen>:
    name: 'imagepick'

    MDBoxLayout:
        orientation: "vertical"
        md_bg_color: app.theme_cls.bg_light

        MDToolbar:
            id: toolbar
            title: "Images selection"
            left_action_items: [["arrow-left" , lambda x: app.ca()]]
            #right_action_items: [["magnify"], ["dots-vertical"]]
            md_bg_color: app.theme_cls.bg_light
            specific_text_color: 0, 0, 0, 1

        ScrollView:

            MDGridLayout:
                id:imagegridlist
                cols: 3
                row_default_height: (self.width - self.cols*self.spacing[0]) / self.cols
                row_force_default: True
                adaptive_height: True
                padding: dp(4), dp(4)
                spacing: dp(4)



class Piccollect(RelativeLayout):
    source = StringProperty('')



<Piccollect>:


    Image:
        id: iimages
        source: root.source #"download.jpeg"
        radius: [20,]
        cache : True


    MDBoxLayout:
        adaptive_height: True
        spacing: "12dp"


        MDIconButton:
            icon: "check"
            size_hint_x: .1
            on_release: app.calll(root.ids.iimages.source)


        MDIconButton:
            icon: "square"
            size_hint_x: .1
            on_release: app.callll()

Elliot Garbus

unread,
Mar 29, 2021, 1:21:21 PM3/29/21
to kivy-...@googlegroups.com

2 suggestons:

  1. Use Glob or Path.glob from Pathlin to get a list of the files.  Then sort as needed.
    1. https://docs.python.org/3/library/pathlib.html#pathlib.Path.glob
    2. https://docs.python.org/3/library/glob.html#module-glob

 

  1. Use a Recycleview rather than a scrollview.  In a scrollview, a widget is created for each object displayed, as you have seen this can result in performance issues.  In a Recycleview there are only widgets created for the visible items.  Widgets are “recycled”, it creates the same visual effect with a small number of widgets.

--
You received this message because you are subscribed to the Google Groups "Kivy users support" group.
To unsubscribe from this group and stop receiving emails from it, send an email to kivy-users+...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/kivy-users/4439b3d1-b98b-45fc-8037-7ac969f7b188n%40googlegroups.com.

 

purushottam yadav

unread,
Mar 30, 2021, 3:27:18 PM3/30/21
to Kivy users support
Thanks for your valuable suggestions .
Now there is no performance issues after using recycleview in place of scrollview . 
BUT
In your first suggestion you said to sort the list , how can that give the same order of images as in the device  ?
Can you explain this in detail . 

Elliot Garbus

unread,
Mar 30, 2021, 4:16:15 PM3/30/21
to kivy-...@googlegroups.com

How are the images sorted?  Name, Date, size?

purushottam yadav

unread,
Mar 31, 2021, 3:08:21 AM3/31/21
to Kivy users support
By name....

Elliot Garbus

unread,
Mar 31, 2021, 9:41:44 AM3/31/21
to kivy-...@googlegroups.com

Use the list method sort() to sort the list in place or use the python built-in sorted to create a new sorted list.

Each of these takes a key function that allows you to customize the sort. 

https://docs.python.org/3/library/stdtypes.html#list.sort

https://docs.python.org/3/library/functions.html#sorted

 

This is a “how to” on sorting: https://docs.python.org/3/howto/sorting.html#sortinghowto

purushottam yadav

unread,
Apr 25, 2021, 11:02:10 AM4/25/21
to Kivy users support
Thanks in advance for responding to my conversation .
AS per your suggestions  , i am using recycleview instead of scrollview . 
In  case of linux , it is  working fine with no delay , but in case of ANDROID  , it is taking time to respond to the function call 

I  used this function below callback_1(self)  to display images on the screen  but the problems are  :

1) screen is not changing immediately  , it is taking some time to change the  screen   . in function , first i wrote code to change the screen and to add images path but it is  not happening , 
screen is getting changed after the loading the images path  , so i wrote other code to load images path into recycleview  at  starting  of the app , but still it is slow to respond to function and change the screen and now app is taking time to start so i undo the changes . 

2)scrolling is not good , it is adding "Piccollect" widgets as I scroll and it is really  too slow to scroll  , which is not good experience for  the client .


3)As I keep scrolling  fast ,  1) all the piccollect widgets are getting disappeared for a while (60 secs) and appearing again at the end of the recycleview
                                                  2 ) sometimes the app is crashing  with below error .


04-25 20:15:25.870  2316  3558 D CompatibilityInfo: applicationDensity - 440
04-25 20:15:25.870  2316  3558 D CompatibilityInfo: applicationScale - 1.0
04-25 20:15:26.201  5970  5970 I obalminusscree: The ClassLoaderContext is a special shared library.
04-25 20:15:26.197  5970  5970 W obalminusscreen: type=1400 audit(0.0:34228): avc: denied { write } for name="com.mi.android.globalminusscreen-BVPOtT3kRNA2CO5ypMT0XQ==" dev="dm-2" ino=1705076 scontext=u:r:system_app:s0 tcontext=u:object_r:apk_data_file:s0 tclass=dir permissive=0
04-25 20:15:26.353  4058  4461 I python  : [INFO   ] [Base        ] Leaving application in progress...
04-25 20:15:26.355  4058  4461 I python  :  Traceback (most recent call last):
04-25 20:15:26.356  4058  4461 I python  :    File "/home/purushottam2/Desktop/project/tttt/yyy/.buildozer/android/app/main.py", line 1391, in <module>
04-25 20:15:26.358  5970  5970 I Perf    : Connecting to perf service.
04-25 20:15:26.384  4058  4461 I python  :    File "/home/purushottam2/Desktop/project/tttt/yyy/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/myapp/kivy/app.py", line 855, in run
04-25 20:15:26.385  4058  4461 I python  :    File "/home/purushottam2/Desktop/project/tttt/yyy/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/myapp/kivy/base.py", line 504, in runTouchApp
04-25 20:15:26.386  4058  4461 I python  :    File "/home/purushottam2/Desktop/project/tttt/yyy/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/myapp/kivy/core/window/window_sdl2.py", line 747, in mainloop
04-25 20:15:26.387  4058  4461 I python  :    File "/home/purushottam2/Desktop/project/tttt/yyy/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/myapp/kivy/core/window/window_sdl2.py", line 479, in _mainloop
04-25 20:15:26.388  4058  4461 I python  :    File "/home/purushottam2/Desktop/project/tttt/yyy/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/myapp/kivy/base.py", line 339, in idle
04-25 20:15:26.389  4058  4461 I python  :    File "/home/purushottam2/Desktop/project/tttt/yyy/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/myapp/kivy/clock.py", line 591, in tick
04-25 20:15:26.390  4058  4461 I python  :    File "kivy/_clock.pyx", line 384, in kivy._clock.CyClockBase._process_events
04-25 20:15:26.391  4058  4461 I python  :    File "kivy/_clock.pyx", line 414, in kivy._clock.CyClockBase._process_events
04-25 20:15:26.391  4058  4461 I python  :    File "kivy/_clock.pyx", line 412, in kivy._clock.CyClockBase._process_events
04-25 20:15:26.392  4058  4461 I python  :    File "kivy/_clock.pyx", line 154, in kivy._clock.ClockEvent.tick
04-25 20:15:26.393  4058  4461 I python  :    File "kivy/_clock.pyx", line 86, in kivy._clock.ClockEvent.get_callback
04-25 20:15:26.394  4058  4461 I python  :    File "/home/purushottam2/Desktop/project/tttt/yyy/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/myapp/kivy/weakmethod.py", line 56, in is_dead
04-25 20:15:26.395  4058  4461 I python  :  ReferenceError: weakly-referenced object no longer exists
04-25 20:15:26.395  4058  4461 I python  : Python for android ended.
04-25 20:15:26.397  5970  5970 W obalminusscreen: type=1400 audit(0.0:34230): avc: denied { read } for name="u:object_r:vendor_display_prop:s0" dev="tmpfs" ino=19071 scontext=u:r:system_app:s0 tcontext=u:object_r:vendor_display_prop:s0 tclass=file permissive=0
04-25 20:15:26.408  5970  5970 E libc    : Access denied finding property "ro.vendor.display.type"
04-25 20:15:26.420  5970  5970 D miuisdk : current sdk level is 19
04-25 20:15:26.420  5970  5970 I miuisdk : setup class hook.
04-25 20:15:26.420  5970  5970 D         : InitMiuiSdkHookClasses
04-25 20:15:26.421  5970  5970 I         : create_mem miui-classproxy page:0x73c16c0000, size:4096
04-25 20:15:26.421  5970  5970 I         : Jit enabled JitInlinerInsertMethod for jit inline
04-25 20:15:26.431  5970  5970 I chatty  : uid=1000(system) com.mi.android.globalminusscreen identical 38 lines
04-25 20:15:26.437  5970  5970 I         : Jit enabled JitInlinerInsertMethod for jit inline
04-25 20:15:26.439  5970  5970 I         : Never hook EnableMethodTracing
04-25 20:15:26.439  5970  5970 I         : Never hook DisableMethodTracing
04-25 20:15:26.439  5970  5970 I         : sConfigureStubsHookFlag is 0x3, so we must hook ConfigureStubs for methodtracing
04-25 20:15:26.439  5970  5970 I         : Hook ConfigureStubs
04-25 20:15:26.442  5970  5970 I         : create_mem miui-classproxy page:0x73c12b7000, size:4096
04-25 20:15:26.451  5970  5970 I         : HookArtPluginInitialize
04-25 20:15:26.548  5970  5970 D FirebaseApp: com.google.firebase.auth.FirebaseAuth is not linked. Skipping initialization.
04-25 20:15:26.548  5970  5970 D FirebaseApp: com.google.firebase.crash.FirebaseCrash is not linked. Skipping initialization.
04-25 20:15:26.549  5970  5970 I FirebaseInitProvider: FirebaseApp initialization successful
04-25 20:15:26.555  5970  5993 W zzd     : Application name is not set. Call Builder#setApplicationName.
04-25 20:15:26.592  2515  2726 D NetworkController.MobileSignalController(2): getDataNetTypeFromServiceState slotId=0  isUsingCarrierAggregation=false
04-25 20:15:26.592  2515  2726 D NetworkTypeUtils: getDataNetTypeFromServiceState:srcDataNetType = 13, destDataNetType 13
04-25 20:15:26.593  2515  2726 D MobileSignalController: updateDataType mSelectedDataTypeIcon[0]=2131232235, mSelectedDataActivityIndex=6
04-25 20:15:26.593  2515  2726 D TelephonyIcons: getSignalStrengthIcon: slot=0, inetCondition=1, level=5, roaming=false, signalstrength=SignalStrength: 99 0 -120 -160 -120 -160 -1 27 -94 -16 -4 2147483647 0 2147483647 99 255 2147483647 gsm|lte use_rsrp_and_rssnr_for_lte_level  [-128, -115, -110, -105, -97] [-115, -105, -95, -85]
04-25 20:15:26.594  2515  2726 D TelephonyIcons: getDataActivity, slot=0, activity=0




=========================simplified code===========================================================================================================================================

    def callback_1(self):
        self.help_str.get_screen('imagepick').manager.current = 'imagepick'

        print("vertical dots clicked")
        print(Window.size)

        #in case of android  , getting images path when function is called
       #in case of ubuntu linux , images path is loaded on starting of the app when recycleview class instance is created . 
 
       if platform == 'android' :
        from android.storage import primary_external_storage_path
        primary_ext_storage = primary_external_storage_path()


        for root, dirs, files in os.walk(str(primary_ext_storage)): 
            for file in files:
               
                if(file.endswith(".jpeg"))  or (file.endswith(".png")) :
               
                    ss =  str(os.path.join(root,file))
                    
                    self.help_str.get_screen('imagepick').ids.rv.data.append(dict({"source" : ss}))    # adding images path one by one into recycleview instance data


                    print("images path added to recycleview data >>>>>>>>>>>>>>>>>....>>>>>>>>>>>>>>>>.")



<Imagepicscreen>:
    name: 'imagepick'

    MDBoxLayout:
        orientation: "vertical"
        md_bg_color: app.theme_cls.bg_light

        MDToolbar:
            id: toolbar
            title: "Images and videos "
            left_action_items: [["arrow-left" , lambda x: app.ca()]]
            md_bg_color: app.theme_cls.bg_light
            specific_text_color: 0, 0, 0, 1



        MDTabs:

            Tab:
                
                text : "Images"


                ImageGallery: #instance of recycleview 
                    id: rv
                    viewclass: 'Piccollect'  # widget to display image and with button 
                    RecycleGridLayout:
                        orientation: 'lr-tb'
                        cols: 4
                        spacing: '20dp'
                        padding: [20]
                        default_size: None, dp(rv.width/self.cols*.8)
                        default_size_hint: 1, None
                        size_hint_y: None
                        height: self.minimum_height




<Piccollect>:


    Image:
        id: iimages
        size_hint:1,1
        source: root.source 
        allow_stretch:True
        keep_ratio:True
        cache : True


    MDBoxLayout:
        adaptive_height: True
        spacing: "12dp"


        MDIconButton:
            icon: "check"
            size_hint_x: .1
            on_release: app.calll(root.ids.iimages.source)


        MDIconButton:
            icon: "square"
            size_hint_x: .1
            on_release: app.callll()



class Piccollect(RecycleDataViewBehavior, RelativeLayout):
    source = StringProperty('" ")


class ImageGallery(RecycleView):

    def __init__(self , **kwargs):
        super(ImageGallery , self).__init__(**kwargs)
        dict_list = []

        ll = []

        # only  Request permissions on Android , not loading images path 
        if platform == 'android' :
            from android.permissions import Permission, request_permissions

            def call__back(permission, results):
                if all([res for res in results]):
                    print("Got all permissions>>>>>>>>>>>>>>>>>>>>>>>")
                    
                    self.data = [] #images path is not loaded case of android


                    
                   
                else:
                    print("Did not get all permissions")

            request_permissions([Permission.WRITE_EXTERNAL_STORAGE, Permission.READ_EXTERNAL_STORAGE], call__back)

        else: #images path is  loaded case of ubuntu 



            from plyer  import storagepath

            for root, dirs, files in os.walk(str(storagepath.get_pictures_dir())):
                for file in files:
                    if(file.endswith(".jpeg"))  or (file.endswith(".png")) :
                        
                        ss =  str(os.path.join(root,file))

                        ll.append(ss)


            li = ll #in case odf android ll = [ ]


            for image_path in li : #self.get_image_paths():
                print(image_path)

                dict_list.append(dict({"source": image_path}))
            

            self.data = dict_list 
#incase of android  , images path is not loaded

            


Elliot Garbus

unread,
Apr 25, 2021, 11:43:37 AM4/25/21
to kivy-...@googlegroups.com

I have not done any android programming, but it is hard to tell exactly what is going on with these code snippets.

A suggestion: profile your code so you know where time is being spent.  See: https://kivy.org/doc/stable/api-kivy.app.html?highlight=app#profiling-with-on-start-and-on-stop

 

You are doing an import in the callback.  This will require file i/O,  Can you move the import out of the callback and only do it once, rather than in every callback?

if platform == 'android' :

        from android.storage import primary_external_storage_path  # This import is happening in the callback.

 

In your note you mention the primary role of the callback is to put an image on the screen, but the callback is walking the file system.

 

        for root, dirs, files in os.walk(str(primary_ext_storage)): 

            for file in files:

                if(file.endswith(".jpeg"))  or (file.endswith(".png"))

                    ss =  str(os.path.join(root,file))

                    self.help_str.get_screen('imagepick').ids.rv.data.append(dict({"source" : ss}))    # adding images path one by one into recycleview instance data

 

This is a double nested loop, walking all of the directories and files in the filesystem.  Can this be moved out of the callback?

The code could be marginally more efficient by using list comprehensions – but the biggest issue is you are walking the filesystem in the callback.

 

Why is Piccollect inheriting form RecyceleDataViewBehavior?

Robert

unread,
Apr 25, 2021, 12:58:05 PM4/25/21
to Kivy users support
Aside from any code issue,

>>>04-25 20:15:26.395  4058  4461 I python  :  ReferenceError: weakly-referenced object no longer exists

Use kivy==2.0.0  and 'buildozer appclean' before the next build

purushottam yadav

unread,
May 12, 2021, 12:32:38 PM5/12/21
to Kivy users support


I made changes as you said in callback  function and I am also using kivy 2 

>>> I also made changes in Imagepicscreen(Screen): and Piccollect(Image)  , to make loading of images address fast  .
now loasding of images address is really fast and 700 images address is loaded within no time  , but i have issues with recycle view scrolling 

issues:

1 ) I am getting this "   W WallpaperManagerService: Wallpaper service gone:    " in logs and the app is crashing and wallpaper is removed (in my android  device ) and replaced by some random pink and black screen .
this is happening when i scroll fast in recycleview , 
2 ) it is still doing lazy loading and scrolling is not smooth  , and  above problem when scrolled fast . 



    def callback_1(self):
        self.help_str.get_screen('imagepick').manager.current = 'imagepick'

        print("vertical dots clicked")
        print(Window.size , "====================================================================================")



class Imagepicscreen(Screen):
    data_items = ListProperty([])

    def on_enter(self , *args):
        print("Entered into the screen ")

        if platform == 'android' :

            print("thread not started")

            Thread(target=self.build_data).start()

            print("thread started    >>>>>>>>>> ")

    def build_data(self):

  
        x = 0
        
        print("Entered into build data function by thread  ")

        for file in glob.glob("/storage/emulated/0/DCIM/Camera/*.*"):

            print("Entered into the looping of images address  " , str(x)  , str(file))
            x += 1

            tmp_data = []
            
            tmp_data.append({'source': str(file)})
            self.data_items.extend(tmp_data)#adding to main thread here instead of load_data function 
       
            print("new image added")

            # add this block of data to the data_items on the main thread
            #Clock.schedule_once(partial(self.load_data, tmp_data)) #should i use this clock schedule ? , required ?


    def load_data(self, tmp_data, dt):
        self.data_items.extend(tmp_data)







<Imagepicscreen>:
    name: 'imagepick'

    MDBoxLayout:
        orientation: "vertical"
        md_bg_color: app.theme_cls.bg_light

        MDToolbar:
            id: toolbar
            title: "Images and videos "
            left_action_items: [["arrow-left" , lambda x: app.ca()]]
            #right_action_items: [["magnify"], ["dots-vertical"]]
            md_bg_color: app.theme_cls.bg_light
            specific_text_color: 0, 0, 0, 1


        MDTabs:

            #id:tabs
            #on_tab_switch: app.on_tab_switch(*args)
            #lock_swiping:True


            Tab:
                #id: tabone
                text : "Images"


                ImageGallery:
                    id: rv
                    viewclass: 'Piccollect'
                    data:root.data_items
                    RecycleGridLayout:
                        orientation: 'lr-tb'
                        cols: 4
                        spacing: '0dp'
                        padding: ['0dp']
                        default_size: None, dp(rv.width/self.cols*.8)
                        default_size_hint: 1, None
                        size_hint_y: None
                        height: self.minimum_height

            Tab:
                #id: tabone
                text : "Videos"


                VideosGallery:
                    id: rrv
                    viewclass: 'Vidcollect'
                    RecycleGridLayout:
                        orientation: 'lr-tb'
                        cols: 4
                        spacing: '20dp'
                        padding: [20]
                        default_size: None, dp(rrv.width/self.cols*.8)
                        default_size_hint: 1, None
                        size_hint_y: None
                        height: self.minimum_height


class Piccollect(Image):
    source = StringProperty('')
    print("created=====================================================")



<Piccollect>:






05-12 15:49:38.226  2318  2334 W InputEventReceiver: Slow Input: 1184ms so far, now at dispatchInputEvent (MotionEvent: event_seq=2993097, seq=5245970, action=ACTION_DOWN)
05-12 15:49:38.227  2514  2514 W InputEventReceiver: Slow Input: 1185ms so far, now at dispatchInputEvent (MotionEvent: event_seq=551517, seq=5245968, action=ACTION_OUTSIDE)
05-12 15:49:38.282  2318  2334 W InputEventReceiver: Slow Input: 977ms so far, now at dispatchInputEvent (MotionEvent: event_seq=2993099, seq=5246022, action=ACTION_MOVE)
05-12 15:49:38.283  2318  2334 W InputEventReceiver: Slow Input: 969ms so far, now at dispatchInputEvent (MotionEvent: event_seq=2993100, seq=5246024, action=ACTION_UP)
05-12 15:49:38.283  2318  2334 W InputEventReceiver: Slow Input: 384ms so far, now at dispatchInputEvent (MotionEvent: event_seq=2993102, seq=5246027, action=ACTION_DOWN)
05-12 15:49:38.285  2318  2469 W MiuiGesturePointerEventListener: onActionDown end: mGestureStatus = 0
05-12 15:49:38.285  2318  2469 W MiuiGesturePointerEventListener: onActionDown end: mGestureStatus = 0
05-12 15:49:38.294  2318  2318 W Looper  : Slow delivery took 759ms main h=android.view.GestureDetector$GestureHandler c=null m=2
05-12 15:49:38.328 26342 26342 W InputEventReceiver: Slow Input: took 857ms in dispatching, now at finishInputEvent (MotionEvent: event_seq=48, seq=5245966, action=ACTION_UP)
05-12 15:49:38.336  2514  2514 W InputEventReceiver: Slow Input: took 133ms in dispatching, now at finishInputEvent (MotionEvent: event_seq=551517, seq=5245968, action=ACTION_OUTSIDE)
05-12 15:49:38.336  2514  2514 W InputEventReceiver: Slow Input: 437ms so far, now at dispatchInputEvent (MotionEvent: event_seq=551518, seq=5246025, action=ACTION_OUTSIDE)
05-12 15:49:38.554  2318  4041 I ActivityManager: Process com.xiaomi.location.fused (pid 7616) has died: prcp TRNB
05-12 15:49:38.554  2318  2334 W Looper  : Slow dispatch took 247ms android.ui h=android.view.Choreographer$FrameHandler c=null m=0
05-12 15:49:38.555  2318  2336 W libprocessgroup: kill(-7616, 9) failed: No such process
05-12 15:49:38.565  1067  1067 I Zygote  : Process 7616 exited due to signal (9)
05-12 15:49:38.567  2318  2318 W Looper  : Drained
05-12 15:49:38.568  2318  2336 W libprocessgroup: kill(-7616, 9) failed: No such process
05-12 15:49:38.568  2318  2336 I libprocessgroup: Successfully killed process cgroup uid 1000 pid 7616 in 14ms
05-12 15:49:38.607 26342 26342 W InputEventReceiver: Slow Input: 1577ms so far, now at dispatchInputEvent (MotionEvent: event_seq=49, seq=5245969, action=ACTION_DOWN)
05-12 15:49:38.679 26999 27009 W facebook.katan: Suspending all threads took: 990.842ms
05-12 15:49:38.681 26999 27085 W AppInitScheduler|Run:   Waiting on LoadDexes for 3864ms...
05-12 15:49:38.730 26999 27099 W facebook.katan: Suspending all threads took: 49.302ms
05-12 15:49:38.736  2318  4041 W ActivityManager: Scheduling restart of crashed service com.xiaomi.location.fused/.FusedLocationService in 72637ms
05-12 15:49:38.909 26342 26342 W InputEventReceiver: Slow Input: took 314ms in dispatching, now at finishInputEvent (MotionEvent: event_seq=49, seq=5245969, action=ACTION_DOWN)
05-12 15:49:38.909  2318  2398 W InputTransport: Slow Input: 777ms so far, channel 'afc95a0 org.test.myapp/org.kivy.android.PythonActivity (server)' publisher ~ publishMotionEvent: seq=5246074, deviceId=5, source=0x1002, action=0x2, actionButton=0x00000000, flags=0x0, edgeFlags=0x0, metaState=0x0, buttonState=0x0, xOffset=0.000000, yOffset=0.000000, xPrecision=1.000000, yPrecision=1.000000, downTime=723674559419000, eventTime=723674791816000, pointerCount=1
05-12 15:49:38.912 26342 26342 W InputEventReceiver: Slow Input: 1607ms so far, now at dispatchInputEvent (MotionEvent: event_seq=50, seq=5246021, action=ACTION_MOVE)
05-12 15:49:38.945 26999 27141 D MuseumVerifier: Attempting verification for SuspendResume with flag file: /data/user/0/com.facebook.katana/app_pgoutils/suspendResumeVerifyV3_900_VV4_PGO
05-12 15:49:38.993  2514  2744 D NetworkController.MobileSignalController(2): getDataNetTypeFromServiceState slotId=0  isUsingCarrierAggregation=false
05-12 15:49:39.005 26342 26342 W InputEventReceiver: Slow Input: 1690ms so far, now at dispatchInputEvent (MotionEvent: event_seq=51, seq=5246023, action=ACTION_UP)
05-12 15:49:39.009  2514  2744 D NetworkTypeUtils: getDataNetTypeFromServiceState:srcDataNetType = 13, destDataNetType 13
05-12 15:49:39.114  2318  3930 D CompatibilityInfo: mCompatibilityFlags - 0
05-12 15:49:39.129  2318  3930 D CompatibilityInfo: applicationDensity - 440
05-12 15:49:39.133  2514  2744 D MobileSignalController: updateDataType mSelectedDataTypeIcon[0]=2131232235, mSelectedDataActivityIndex=6
05-12 15:49:39.133  2514  2744 D TelephonyIcons: getSignalStrengthIcon: slot=0, inetCondition=1, level=5, roaming=false, signalstrength=SignalStrength: 99 0 -120 -160 -120 -160 -1 29 -85 -14 76 2147483647 0 2147483647 99 255 2147483647 gsm|lte use_rsrp_and_rssnr_for_lte_level  [-128, -115, -110, -105, -97] [-115, -105, -95, -85]
05-12 15:49:39.133  2514  2744 D TelephonyIcons: getDataActivity, slot=0, activity=3
05-12 15:49:39.139  2514  2744 D TelephonyIcons: null signal icon name: drawable/stat_sys_signal_null
05-12 15:49:39.139  2514  2744 D TelephonyIcons: getDataTypeIcon sub=0
05-12 15:49:39.201  2318  3930 D CompatibilityInfo: applicationScale - 1.0
05-12 15:49:39.238  2852  4948 I DPMJ    : |REQ:RCVR| DPM creating socket
05-12 15:49:39.307 26342 26342 W InputEventReceiver: Slow Input: took 303ms in dispatching, now at finishInputEvent (MotionEvent: event_seq=51, seq=5246023, action=ACTION_UP)
05-12 15:49:39.319 26342 26342 W InputEventReceiver: Slow Input: 1419ms so far, now at dispatchInputEvent (MotionEvent: event_seq=52, seq=5246026, action=ACTION_DOWN)
05-12 15:49:39.365  2318  2336 W libprocessgroup: kill(-27154, 9) failed: No such process
05-12 15:49:39.368  1067  1067 I Zygote  : Process 27154 exited due to signal (9)
05-12 15:49:39.371  2318  2336 W libprocessgroup: kill(-27154, 9) failed: No such process
05-12 15:49:39.371  2318  2336 I libprocessgroup: Successfully killed process cgroup uid 10029 pid 27154 in 6ms
05-12 15:49:39.481 26999 27140 V AospBugFixOpts: set AOSP bug fix jboolean EnableAospBugFixes: bugFixOpt -> enable = 0. Given 0
05-12 15:49:39.492 26999 27141 D MuseumVerifier: Parsed error [prior result: failure] for SuspendResume : Failed runtime->preinitialization_transactions_.empty()
05-12 15:49:39.492 26999 27141 D MuseumVerifier: Previously failed verification of SuspendResume, not trying again. Previous error: Failed runtime->preinitialization_transactions_.empty()
05-12 15:49:39.518 26999 27141 W SUSPEND_RESUME: Failed to verify SuspendResume with error: Previously failed verification of SuspendResume, not trying again. Previous error: Failed runtime->preinitialization_transactions_.empty()
05-12 15:49:39.560  2318  3930 I ActivityManager: Process com.android.camera (pid 27154) has died: cch  CEM 
05-12 15:49:39.592 27178 27178 F linker  : CANNOT LINK EXECUTABLE "/system/bin/dpmd": "/system/lib64/libdpmframework.so" is 32-bit instead of 64-bit
05-12 15:49:39.605  2318  3930 D ProcessRecordInjector: Begin to report kill process events...
05-12 15:49:39.655 26999 27141 D SUSPEND_RESUME: isSuspendResumeSupported: 0
05-12 15:49:39.666 26999 27141 D PgoUtils: Art Pgo supported on platform: 0 suspend and resume supported: 0
05-12 15:49:39.666 26999 27141 D PgoUtils: PGO Utils was not successfully inited [pgoutils: 0]
05-12 15:49:39.683 26999 27085 W AppInitScheduler|Run:   Waiting on LoadDexes for 4866ms...
05-12 15:49:39.969  2514  2744 D NetworkController.MobileSignalController(2): getDataNetTypeFromServiceState slotId=0  isUsingCarrierAggregation=false
05-12 15:49:39.969  2514  2744 D NetworkTypeUtils: getDataNetTypeFromServiceState:srcDataNetType = 13, destDataNetType 13
05-12 15:49:40.067  2318  2334 W Looper  : Slow dispatch took 461ms android.ui h=com.android.server.am.ActivityManagerService$UiHandler c=null m=53
05-12 15:49:40.068  2318  2334 W Looper  : Slow delivery took 239ms android.ui h=com.android.server.policy.BaseMiuiPhoneWindowManager$H c=com.android.server.policy.BaseMiuiPhoneWindowManager$12@88354ee m=0
05-12 15:49:40.101  2514  2744 D MobileSignalController: updateDataType mSelectedDataTypeIcon[0]=2131232235, mSelectedDataActivityIndex=6
05-12 15:49:40.112  2514  2744 D TelephonyIcons: getSignalStrengthIcon: slot=0, inetCondition=1, level=5, roaming=false, signalstrength=SignalStrength: 99 0 -120 -160 -120 -160 -1 29 -85 -14 76 2147483647 0 2147483647 99 255 2147483647 gsm|lte use_rsrp_and_rssnr_for_lte_level  [-128, -115, -110, -105, -97] [-115, -105, -95, -85]
05-12 15:49:40.112  2514  2744 D TelephonyIcons: getDataActivity, slot=0, activity=0
05-12 15:49:40.121  2514  2744 D TelephonyIcons: null signal icon name: drawable/stat_sys_signal_null
05-12 15:49:40.122  2514  2744 D TelephonyIcons: getDataTypeIcon sub=0
05-12 15:49:40.213  2514  2670 I OpenGLRenderer: Davey! duration=969ms; Flags=0, IntendedVsync=723675902615226, Vsync=723676152615216, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=723676160890608, AnimationStart=723676224117066, PerformTraversalsStart=723676224125348, DrawStart=723676604797274, SyncQueued=723676689445608, SyncStart=723676689753681, IssueDrawCommandsStart=723676735644827, SwapBuffers=723676841362899, FrameCompleted=723676872662222, DequeueBufferDuration=10548000, QueueBufferDuration=7937000, 
05-12 15:49:40.277  2318  3930 D PerfShielderService: com.android.systemui|StatusBar|502|723668052588476|477|3|2
05-12 15:49:40.329  2318  3930 D PerfShielderService: com.android.systemui|StatusBar|184|723668585064569|177|3|2
05-12 15:49:40.373  3489 20663 W MiuiPerfServiceClient: interceptAndQueuing:2514|com.android.systemui|502|477|unknown|null|StatusBar|723668052588476|Slow handle traversal|2
05-12 15:49:40.375  3489  3520 W MiuiPerfServiceClient: interceptAndQueuing:2514|com.android.systemui|184|177|unknown|null|StatusBar|723668585064569|Slow handle traversal|2
05-12 15:49:40.425  2318  2327 I system_server: Background concurrent copying GC freed 336035(19MB) AllocSpace objects, 78(3MB) LOS objects, 35% free, 43MB/67MB, paused 88.563ms total 2.834s
05-12 15:49:40.505 26877 26877 W com.truecaller: Verification of void com.google.android.chimera.ModuleContext.<clinit>() took 122.670ms
05-12 15:49:40.693  2318  2398 I InputDispatcher: Window 'Window{afc95a0 u0 org.test.myapp/org.kivy.android.PythonActivity}' spent 2471.6ms processing the last input event: MotionEvent
05-12 15:49:40.712 26999 27085 W AppInitScheduler|Run:   Waiting on LoadDexes for 5895ms...
05-12 15:49:40.790 26342 26342 W InputEventReceiver: Slow Input: took 1356ms in dispatching, now at finishInputEvent (MotionEvent: event_seq=52, seq=5246026, action=ACTION_DOWN)
05-12 15:49:40.903 26877 26885 W com.truecaller: Suspending all threads took: 83.547ms
05-12 15:49:41.012 26877 26877 W com.truecaller: Verification of void com.google.android.chimera.ModuleContext.<init>(android.content.Context, com.google.android.chimera.ModuleContext, crx, java.lang.String, int, android.content.res.Resources, java.lang.ClassLoader, cpr) took 506.468ms
05-12 15:49:41.249 26877 26877 W com.truecaller: Verification of void com.google.android.chimera.ModuleContext.a(android.content.Context, com.google.android.chimera.ModuleContext, crx, java.lang.String, int, java.lang.String, android.content.res.Resources, java.lang.ClassLoader, java.util.Map) took 223.901ms
05-12 15:49:41.446 26342 26342 W InputEventReceiver: Slow Input: 3292ms so far, now at dispatchInputEvent (MotionEvent: event_seq=53, seq=5246074, action=ACTION_MOVE)
05-12 15:49:41.714  2318  2335 D Boost   : hostingType=service, hostingName=com.android.settings/.dangerousoptions.DangerousOptionsWarningService, callerPackage=com.android.settings, isSystem=true, isBoostNeeded=false.
05-12 15:49:41.757 26999 27085 W AppInitScheduler|Run:   Waiting on LoadDexes for 6905ms...
05-12 15:49:41.812  1067  1067 I Zygote  : Process 8720 exited due to signal (9)
05-12 15:49:41.815  2318  2398 W InputDispatcher: channel 'b28c9e0 com.miui.miwallpaper.MiWallpaper (server)' ~ Consumer closed input channel or an error occurred.  events=0x9
05-12 15:49:41.815  2318  2398 E InputDispatcher: channel 'b28c9e0 com.miui.miwallpaper.MiWallpaper (server)' ~ Channel is unrecoverably broken and will be disposed!
05-12 15:49:41.821  2318  2336 W libprocessgroup: kill(-8720, 9) failed: No such process
05-12 15:49:41.821  2318  2336 I libprocessgroup: Successfully killed process cgroup uid 10084 pid 8720 in 8ms
05-12 15:49:41.855  2318  2335 W BoostFramework: Slow Operation: BoostFramework perfHint took 72ms
05-12 15:49:41.861 27180 27180 E settings:remot: Not starting debugger since process cannot load the jdwp agent.



05-12 15:49:41.876  2318 10308 I WindowManager: WIN DEATH: Window{b28c9e0 u0 com.miui.miwallpaper.MiWallpaper}
05-12 15:49:41.877  2318 10308 W InputDispatcher: Attempted to unregister already unregistered input channel 'b28c9e0 com.miui.miwallpaper.MiWallpaper (server)'





05-12 15:49:41.878  2318  2318 W WallpaperManagerService: Wallpaper service gone: ComponentInfo{com.miui.miwallpaper/com.miui.miwallpaper.MiWallpaper}




05-12 15:49:41.888  2318  2398 W InputDispatcher: channel '371861c com.miui.home/com.miui.home.launcher.Launcher (server)' ~ Consumer closed input channel or an error occurred.  events=0x9
05-12 15:49:41.888  2318  2398 E InputDispatcher: channel '371861c com.miui.home/com.miui.home.launcher.Launcher (server)' ~ Channel is unrecoverably broken and will be disposed!
05-12 15:49:41.890  1067  1067 I Zygote  : Process 8322 exited due to signal (9)
05-12 15:49:41.909  2318  3508 I ActivityManager: Process com.miui.miwallpaper (pid 8720) has died: vis  BFGS
05-12 15:49:41.913  2318  3508 W ActivityManager: Scheduling restart of crashed service com.miui.miwallpaper/.MiWallpaper in 79461ms
05-12 15:49:41.918  2318  2398 W InputDispatcher: channel 'f22612f InputMethod (server)' ~ Consumer closed input channel or an error occurred.  events=0x9
05-12 15:49:41.918  2318  2398 E InputDispatcher: channel 'f22612f InputMethod (server)' ~ Channel is unrecoverably broken and will be disposed!
05-12 15:49:41.923  1067  1067 I Zygote  : Process 6816 exited due to signal (9)
05-12 15:49:41.937  1067  1067 I Zygote  : Process 5881 exited due to signal (9)
05-12 15:49:41.938  2318  2666 I StatusBarManagerService: binder died for pkg=com.miui.home
05-12 15:49:41.939  1067  1067 I Zygote  : Process 6088 exited due to signal (9)
05-12 15:49:41.939  2318  2334 W Looper  : Drained
05-12 15:49:42.032  2318  3924 I WindowManager: WIN DEATH: Window{371861c u0 com.miui.home/com.miui.home.launcher.Launcher}
05-12 15:49:42.032  2318  3924 W InputDispatcher: Attempted to unregister already unregistered input channel '371861c com.miui.home/com.miui.home.launcher.Launcher (server)'
05-12 15:49:42.040  2318  3929 I WindowManager: WIN DEATH: Window{f22612f u0 InputMethod}
05-12 15:49:42.040  2318  3929 W InputDispatcher: Attempted to unregister already unregistered input channel 'f22612f InputMethod (server)'
05-12 15:49:42.075  2514  2744 D NetworkController.MobileSignalController(2): getDataNetTypeFromServiceState slotId=0  isUsingCarrierAggregation=false
05-12 15:49:42.075  2514  2744 D NetworkTypeUtils: getDataNetTypeFromServiceState:srcDataNetType = 13, destDataNetType 13
05-12 15:49:42.085  2318  2335 I ActivityManager: Start proc 27180:com.android.settings:remote/1000 for service com.android.settings/.dangerousoptions.DangerousOptionsWarningService caller=com.android.settings
05-12 15:49:42.086  2318  3932 I ActivityManager: Process com.google.android.googlequicksearchbox:interactor (pid 8322) has died: vis  BFGS
05-12 15:49:42.086  2318  2336 W libprocessgroup: kill(-8322, 9) failed: No such process
05-12 15:49:42.086  2318  2336 I libprocessgroup: Successfully killed process cgroup uid 10043 pid 8322 in 0ms
05-12 15:49:42.086  2318  3932 W ActivityManager: Scheduling restart of crashed service com.google.android.googlequicksearchbox/com.google.android.voiceinteraction.GsaVoiceInteractionService in 89288ms
05-12 15:49:42.096  2318  2336 W libprocessgroup: kill(-6816, 9) failed: No such process
05-12 15:49:42.096  2318  3931 I ActivityManager: Process com.google.android.inputmethod.latin (pid 6816) has died: vis  BFGS
05-12 15:49:42.096  2318  2336 I libprocessgroup: Successfully killed process cgroup uid 10091 pid 6816 in 0ms
05-12 15:49:42.097  2318  3931 W ActivityManager: Scheduling restart of crashed service com.google.android.inputmethod.latin/com.android.inputmethod.latin.spellcheck.AndroidSpellCheckerService in 99278ms

Elliot Garbus

unread,
May 12, 2021, 12:51:10 PM5/12/21
to kivy-...@googlegroups.com

I can take a look at the code running on a desktop if you have an issue there.  If so post an minimal executable program.

Robert

unread,
May 12, 2021, 1:29:33 PM5/12/21
to Kivy users support
All those 'slow' messages suggest there is a lot of functionality on the UI thread. Presumably RecycleView continually rebuilding its database.
Android is very picky about UI responsiveness.

Writing to a UI widget from a non-UI thread is not thread safe, use the commented Clock code. (sometimes one can get away with this, but here one could imagine RecycleView's data list being overwritten before the view is rebuilt -  leading to memory issues, which is probably what you are seeing). A side effect of this is the RecycleView update will be buffered, in order to maintain frame rate more than one image will be added per frame.

But there may still be performance issues. Consider doing explicit buffering yourself, rebuilding the RecycleView every frame is probably faster than anybody can see. Also it might be faster to do the glob() in say build() and have one final list ready for RecycleView, perhaps on_start()

purushottam yadav

unread,
May 13, 2021, 4:57:24 AM5/13/21
to Kivy users support
Brroo

Below  minimal executable program and environment details . how to deal with below  issues  . 
Code  works fine on ubuntu  , problem when running on android device .

1 ) I am getting this "   W WallpaperManagerService: Wallpaper service gone:    " in logs and the app is crashing and wallpaper is removed (in my android  device ) and replaced by some random pink and black screen .
this is happening when i scroll fast in recycleview , 
2 ) it is still doing lazy loading and scrolling is not smooth  , and  above problem when scrolled fast . 


============================environment details ==============================


   pip freeze


appdirs==1.4.4
buildozer==1.2.0
certifi==2020.12.5
chardet==3.0.4
colorama==0.4.4
Cython==0.29.21
distlib==0.3.1
docutils==0.16
ffpyplayer==4.3.2
filelock==3.0.12
idna==2.10
importlib-metadata==3.1.1
Jinja2==2.11.2
kivmob==2.0

Kivy==2.0.0

Kivy-Garden==0.1.4
kivy-garden.mapview==1.0.5
kivy-garden.xcamera==2020.613
kivymd==0.104.1
MarkupSafe==1.1.1
numpy==1.20.0
opencv-python==4.5.1.48
pep517==0.6.0
pexpect==4.8.0
Pillow==8.0.1
plyer==2.0.0
ptyprocess==0.6.0
pygame==2.0.1
Pygments==2.7.3
pytoml==0.1.21
requests==2.25.0
sh==1.14.1
six==1.15.0
toml==0.10.2
urllib3==1.26.2
virtualenv==20.2.1
xcamera==2020.613
zipp==3.4.0



=============================minimal executable code ===========================================

from kivymd.app import MDApp
from kivy.uix.screenmanager import Screen,ScreenManager
from kivy.lang import Builder
from kivy.uix.floatlayout import FloatLayout
from kivymd.uix.swiper import MDSwiperItem
from kivymd.utils.fitimage import FitImage
from kivymd.uix.boxlayout import MDBoxLayout
from kivy.uix.scrollview import ScrollView
from kivymd.uix.list import MDList , ThreeLineAvatarListItem
from kivymd.uix.label import MDLabel
from kivymd.uix.list import OneLineListItem
from kivymd.uix.imagelist import SmartTile
from kivy.uix.modalview import ModalView
from kivy.properties import StringProperty, NumericProperty
from kivy.uix.behaviors import ButtonBehavior
from kivy.uix.image import Image
from kivymd.uix.list import IRightBodyTouch
from kivy.metrics import sp, dp
from kivy.uix.stacklayout import StackLayout
from kivymd.uix import MDAdaptiveWidget
from kivymd.uix.button import MDFlatButton , MDIconButton
from kivy.uix.carousel import Carousel
from kivymd.uix.list import ImageLeftWidget
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.carousel import MDCarousel
from kivy.uix.relativelayout import RelativeLayout
from kivy.properties import (
    AliasProperty,
    BooleanProperty,
    BoundedNumericProperty,
    ListProperty,
    NumericProperty,
    ObjectProperty,
    OptionProperty,
    StringProperty,
)

from kivy.animation import Animation
from kivy.lang import Builder
from kivy.utils import get_color_from_hex
from kivymd.app import MDApp
from kivymd.utils.fitimage import FitImage
from kivy.utils import get_color_from_hex
from kivymd.app import MDApp
from kivymd.utils.fitimage import FitImage
from kivymd.uix.tab  import MDTabsBase
from kivy.uix.video import Video
from kivy.core.window import Window
#Window.size = (420,860)
#from homemapview import HomeMapView
#from searchpopupmenu import SearchPopupMenu
#from homegpshelper import HomeGpsHelper
from os import path
import os
import shutil
from shutil import copyfile
from sys import exit
import glob
from plyer  import storagepath
from kivy.uix.recycleview import RecycleView
from kivy.uix.recycleview.views import RecycleDataViewBehavior

from threading import Thread

from kivy.utils import platform

from kivy.clock import Clock
from functools import partial


#Builder String


helper_string = '''

#: import mtx kivy.metrics
#: import  Window  kivy.core.window


ScreenManager:

    Hello:


    Imagepicscreen:


<Piccollect>:
                        spacing: '5dp'
                        padding: ['5dp']
                        default_size: None, dp(rv.width/self.cols*.6)
                        default_size_hint: 1, None
                        size_hint_y: None
                        height: self.minimum_height

            Tab:
                #id: tabone
                text : "Videos"


<Hello>:
    name: 'hello'
    BoxLayout:
        orientation:'vertical'
        MDToolbar:
            title: 'ONLINE 88'
            right_action_items:  [['upload', lambda x: app.callback_1() ]]


        MDTabs:

            id:tabs
            on_tab_switch: app.on_tab_switch(*args)
            #lock_swiping:True


            Tab:
                id: tabone
                text : "map-marker-star"

                MDBottomNavigation:
                    id : navpanel
                    panel_color : 1,1,1,1


                    MDBottomNavigationItem:
                        id : nearby

                        text: "Near by"
                        icon:  "map-marker-circle"
                        ScrollView:

                            do_scroll: [ False , True]
                            scroll_type: ['content']
                            #size_hint_y: None
                            size_hint : (1, None)
                            size:(Window.width, self.parent.height)
                            #height: self.parent.height
                            #effect_cls: 'ScrollEffect'

                            MDGridLayout:
                                id: post_lists

                                cols : 1

                                size_hint_y: None
                                size: self.minimum_size
                                padding: ["0dp", "150dp","0dp", "15dp"]
                                spacing: "50dp"


                    MDBottomNavigationItem:
                        name :'Favourite'

                        text: "Favourite"
                        icon: "heart-settings"

                        MDLabel:
                            text: "Favourite people and  places  "
                            halign: 'center'

            Tab:
                text: "wan"
                MDLabel:
                    id:"meme box"
                    text : "meme box"
                    halign : "center"


'''
class Hello(Screen):
    pass


class Imagepicscreen(Screen):
    data_items = ListProperty([])

    def on_enter(self , *args):
        print("Entered into the screen ")

        if platform == 'android' :
            print("thread not started")
            Thread(target=self.build_data).start()
            print("thread started    >>>>>>>>>> ")


        else: #images path is  loaded case of ubuntu


            from plyer  import storagepath
            dict_list = []

            ll = []

            for root, dirs, files in os.walk(str(storagepath.get_pictures_dir())):
                for file in files:
                    if(file.endswith(".jpeg"))  or (file.endswith(".png")) :

                        ss =  str(os.path.join(root,file))

                        ll.append(ss)

            li = ll #in case odf android ll = [ ]

            for image_path in li : #self.get_image_paths():
                print(image_path)

                dict_list.append(dict({"source": image_path}))

            self.data_items = dict_list


    def build_data(self):

        x = 0

        print("Entered into build data function by thread  ")
        for file in glob.glob("/storage/emulated/0/DCIM/Camera/*.*"):
            print("Entered into the looping of images address  " , str(x)  , str(file))
            tmp_data = []

            tmp_data.append({'source': str(file)})
            self.data_items.extend(tmp_data)
            x += 1
            print("new image added")
            # add this block of data to the data_items on the main thread
            #Clock.schedule_once(partial(self.load_data, tmp_data))

    def load_data(self, tmp_data, dt):
        self.data_items.extend(tmp_data)


class Tab(FloatLayout, MDTabsBase):
    pass


class Piccollect(Image):
    source = StringProperty('')
    print("created=====================================================")


class ImageGallery(RecycleView):

    def __init__(self , **kwargs):
        super(ImageGallery , self).__init__(**kwargs)


        # only  Request permissions on Android , not loading images path
        if platform == 'android' :
            from android.permissions import Permission, request_permissions

            def call__back(permission, results):
                if all([res for res in results]):
                    print("Got all permissions>>>>>>>>>>>>>>>>>>>>>>>")

                    self.data = [] #images path is not loaded case of android




                else:
                    print("Did not get all permissions")

            request_permissions([Permission.WRITE_EXTERNAL_STORAGE, Permission.READ_EXTERNAL_STORAGE], call__back)

#incase of android  , images path is not loaded
sm = ScreenManager()

sm.add_widget(Hello(name = 'hello'))


sm.add_widget(Imagepicscreen(name = 'imagepick'))


class DemoApp(MDApp):



    def build(self):

        self.theme_cls.primary_palette   = 'Indigo'
        self.theme_cls.accent_palette =  'Purple'

        screen = Screen()

        self.help_str = Builder.load_string(helper_string)

        screen.add_widget(self.help_str)

        return screen

    def on_start(self):

        search_menu = None
        print("started app =================================" )


    def callback_1(self):
        self.help_str.get_screen('imagepick').manager.current = 'imagepick'

        print("vertical dots clicked")
        print(Window.size , "llllllllllllllllllllllllllll")



k = DemoApp()
k.run()

Elliot Garbus

unread,
May 13, 2021, 9:33:23 AM5/13/21
to kivy-...@googlegroups.com

I’m not running on Android – but here are a few things to consider.

 

You are running a method build_data() in a separate thread, but call it when you are in the screen that will use the data.  This sets up a race condition of filling in the data and using the data.  It is not clear there is any advantage to running this code in a separate thread.

You could move this code to on_start() or somewhere earlier to ensure it runs concurrent with different code – and that the list of files will be complete prior to being used.  I would also recommend a thread join just prior to using this data to ensure there is no race condition.

 

You are using on_enter to do calculations prior to entering the screen.  I would suggest you use on_pre_enter() this will give you more time.  On_pre_enter starts prior to the screen animation.

 

This code:

x = 0

print("Entered into build data function by thread  ")
for file in glob.glob("/storage/emulated/0/DCIM/Camera/*.*"
):
   
print("Entered into the looping of images address  ", str(x), str(file))
    tmp_data = []

    tmp_data.append({
'source': str(file)})
   
self.data_items.extend(tmp_data)
    x +=
1
   
print("new image added")
   
# add this block of data to the data_items on the main thread
    # Clock.schedule_once(partial(self.load_data, tmp_data))

 

is very inefficient and can be replaced with:

self.data_items = [{'source': file} for file in glob.glob("/storage/emulated/0/DCIM/Camera/*.*")]

purushottam yadav

unread,
May 16, 2021, 8:57:03 AM5/16/21
to Kivy users support
How about this code ? 
call_back function will change the screen only if it is ready to display (using a variable to decide this ), if not it will call other fun to take permissions and again that fun(take permission function ) will call other fun to load images address to recycleview  data , then to change screen  , set the variable to ready .
This is working fine on ubuntu but app is crashing on android device on starting the app with an error   below. 
I am using kivy 2  and environment details are in above comment .
python3.9 --version gives Python 3.9.5 on terminal . 
what should i update ??





05-16 17:57:46.187  2320  2486 D HBMFeatureControl: brightness=16
05-16 17:57:46.190   763   763 D qdlights: entry write_int path = /sys/class/leds/lcd-backlight/brightness, value=16
05-16 17:57:46.191   763   763 E libc    : Access denied finding property "persist.sys.display_debug"
05-16 17:57:46.239 28115 28307 I python  : [INFO   ] [Image       ] Providers: img_tex, img_dds, img_sdl2, img_pil, img_gif (img_ffpyplayer ignored)
05-16 17:57:46.271 28115 28307 I python  : [INFO   ] [Text        ] Provider: sdl2
05-16 17:57:46.449 28115 28191 I org.test.myapp: ProcessProfilingInfo new_methods=133 is saved saved_to_disk=1 resolve_classes_delay=8000
05-16 17:57:46.559 28115 28307 I python  : [INFO   ] [Window      ] Provider: sdl2
05-16 17:57:46.579 28115 28307 E libEGL  : validate_display:92 error 3008 (EGL_BAD_DISPLAY)
05-16 17:57:46.580 28115 28307 V SDL     : setOrientation() orientation=-1 width=800 height=600 resizable=true hint=
05-16 17:57:46.584 28115 28307 I python  : [INFO   ] [GL          ] Using the "OpenGL ES 2" graphics system
05-16 17:57:46.585 28115 28307 I python  : [INFO   ] [GL          ] Backend used <sdl2>
05-16 17:57:46.586 28115 28307 I python  : [INFO   ] [GL          ] OpenGL version <b'OpenGL ES 3.2 V@331.0 (GIT@c455b9b, Ib7912a5d4e) (Date:09/16/19)'>
05-16 17:57:46.586 28115 28307 I python  : [INFO   ] [GL          ] OpenGL vendor <b'Qualcomm'>
05-16 17:57:46.586 28115 28307 I python  : [INFO   ] [GL          ] OpenGL renderer <b'Adreno (TM) 512'>
05-16 17:57:46.586 28115 28307 I python  : [INFO   ] [GL          ] OpenGL parsed version: 3, 2
05-16 17:57:46.586 28115 28307 I python  : [INFO   ] [GL          ] Texture max size <16384>
05-16 17:57:46.586 28115 28307 I python  : [INFO   ] [GL          ] Texture max units <16>
05-16 17:57:46.603  2320  2486 D HBMFeatureControl: brightness=50
05-16 17:57:46.605   763   763 D qdlights: entry write_int path = /sys/class/leds/lcd-backlight/brightness, value=50
05-16 17:57:46.606   763   763 E libc    : Access denied finding property "persist.sys.display_debug"
05-16 17:57:46.620  2320  2486 D HBMFeatureControl: brightness=132
05-16 17:57:46.622   763   763 D qdlights: entry write_int path = /sys/class/leds/lcd-backlight/brightness, value=132
05-16 17:57:46.622   763   763 E libc    : Access denied finding property "persist.sys.display_debug"
05-16 17:57:46.628 28115 28307 I python  : [INFO   ] [Window      ] auto add sdl2 input provider
05-16 17:57:46.630 28115 28307 I python  : [INFO   ] [Window      ] virtual keyboard not allowed, single mode, not docked
05-16 17:57:46.636  2320  2486 D HBMFeatureControl: brightness=50
05-16 17:57:46.638   763   763 D qdlights: entry write_int path = /sys/class/leds/lcd-backlight/brightness, value=50
05-16 17:57:46.638   763   763 E libc    : Access denied finding property "persist.sys.display_debug"
05-16 17:57:46.652  2320  2486 D HBMFeatureControl: brightness=16
05-16 17:57:46.654   763   763 D qdlights: entry write_int path = /sys/class/leds/lcd-backlight/brightness, value=16
05-16 17:57:46.654   763   763 E libc    : Access denied finding property "persist.sys.display_debug"
05-16 17:57:46.828 28115 28307 I python  : [INFO   ] [Video       ] Provider: null(['video_ffmpeg', 'video_ffpyplayer'] ignored)
05-16 17:57:46.848 28115 28307 I python  : created=====================================================
05-16 17:57:46.885 28115 28307 I python  : [INFO   ] [GL          ] NPOT texture support is available
05-16 17:57:47.072 28195 28212 I ui.cloudservic: ProcessProfilingInfo new_methods=0 is saved saved_to_disk=0 resolve_classes_delay=8000
05-16 17:57:47.189  1092  2410 D installd: Found valid user 999
05-16 17:57:47.337 28115 28307 I python  : started app =================================
05-16 17:57:47.337 28115 28307 I python  : [WARNING] [Base        ] Unknown <android> provider
05-16 17:57:47.338 28115 28307 I python  : [INFO   ] [Base        ] Start application main loop
05-16 17:57:47.392 28115 28307 I python  : [INFO   ] [Base        ] Leaving application in progress...


05-16 17:57:47.392 28115 28307 I python  :  Traceback (most recent call last):
05-16 17:57:47.392 28115 28307 I python  :    File "/home/purushottam2/Desktop/project/tttt/yyy/.buildozer/android/app/main.py", line 373, in <module>
05-16 17:57:47.395 28115 28307 I python  :    File "/home/purushottam2/Desktop/project/tttt/yyy/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/myapp/kivy/app.py", line 855, in run
05-16 17:57:47.395 28115 28307 I python  :    File "/home/purushottam2/Desktop/project/tttt/yyy/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/myapp/kivy/base.py", line 504, in runTouchApp
05-16 17:57:47.395 28115 28307 I python  :    File "/home/purushottam2/Desktop/project/tttt/yyy/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/myapp/kivy/core/window/window_sdl2.py", line 747, in mainloop
05-16 17:57:47.395 28115 28307 I python  :    File "/home/purushottam2/Desktop/project/tttt/yyy/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/myapp/kivy/core/window/window_sdl2.py", line 479, in _mainloop
05-16 17:57:47.396 28115 28307 I python  :    File "/home/purushottam2/Desktop/project/tttt/yyy/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/myapp/kivy/base.py", line 339, in idle
05-16 17:57:47.396 28115 28307 I python  :    File "/home/purushottam2/Desktop/project/tttt/yyy/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/myapp/kivy/clock.py", line 591, in tick
05-16 17:57:47.396 28115 28307 I python  :    File "kivy/_clock.pyx", line 384, in kivy._clock.CyClockBase._process_events
05-16 17:57:47.397 28115 28307 I python  :    File "kivy/_clock.pyx", line 414, in kivy._clock.CyClockBase._process_events
05-16 17:57:47.397 28115 28307 I python  :    File "kivy/_clock.pyx", line 412, in kivy._clock.CyClockBase._process_events
05-16 17:57:47.397 28115 28307 I python  :    File "kivy/_clock.pyx", line 154, in kivy._clock.ClockEvent.tick
05-16 17:57:47.397 28115 28307 I python  :    File "kivy/_clock.pyx", line 86, in kivy._clock.ClockEvent.get_callback
05-16 17:57:47.398 28115 28307 I python  :    File "/home/purushottam2/Desktop/project/tttt/yyy/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/myapp/kivy/weakmethod.py", line 56, in is_dead
05-16 17:57:47.398 28115 28307 I python  :  ReferenceError: weakly-referenced object no longer exists
05-16 17:57:47.398 28115 28307 I python  : Python for android ended.
05-16 17:57:47.416  1092  2410 D installd: Found valid user 999




===============================================================code ================================================
                    #data:root.data_items
    pass



#    def build_data(self):
#
#        x = 0
#
#        print("Entered into build data function by thread  ")
#        for file in glob.glob("/storage/emulated/0/DCIM/Camera/*.*"):
#            print("Entered into the looping of images address  " , str(x)  , str(file))
#            tmp_data = []
#
#
#            tmp_data.append({'source': str(file)})
#            #self.data_items.extend(tmp_data)
#            x += 1
#            print("new image added")
#            # add this block of data to the data_items on the main thread
#            Clock.schedule_once(partial(self.load_data, tmp_data))
#
#    def load_data(self, tmp_data, dt):
#        self.data_items.extend(tmp_data)
#        print(len(self.data_items) , "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<")
#        print(tmp_data , "======================================")


class Tab(FloatLayout, MDTabsBase):
    pass


class Piccollect(Image):
    source = StringProperty('')
    print("created=====================================================")
    def on_touch_down( self, touch ):

        if  self.collide_point( *touch.pos ):
            print("selecting......" , self.source)


class ImageGallery(RecycleView):

    def __init__(self , **kwargs):
        super(ImageGallery , self).__init__(**kwargs)


#incase of android  , images path is not loaded
sm = ScreenManager()

sm.add_widget(Hello(name = 'hello'))

sm.add_widget(Imagepicscreen(name = 'imagepick'))


class DemoApp(MDApp):


    def build(self):


        self.theme_cls.primary_palette   = 'Indigo'
        self.theme_cls.accent_palette =  'Purple'
        self.per = False
        self.imagepicscreen = "not-ready"

        screen = Screen()

        self.help_str = Builder.load_string(helper_string)

        screen.add_widget(self.help_str)

        return screen

    def on_start(self):

        search_menu = None
        print("started app =================================" )


    def  ca(self):
        self.help_str.get_screen('hello').manager.current = 'hello'

    def callback_1(self):
        if self.imagepicscreen == "ready":

            self.help_str.get_screen('imagepick').manager.current = 'imagepick'
        else :
            print("screen is getting ready try later ")
            self.takingper()#take permissions for storage

        print("vertical dots clicked")
        print(Window.size , "llllllllllllllllllllllllllll")

    def takingper(self):
        # only  Request permissions on Android , not loading images path
        if platform == 'android' :
            from android.permissions import Permission, request_permissions

            def call__back(permission, results):
                if all([res for res in results]):
                    print("Got all permissions>>>>>>>>>>>>>>>>>>>>>>>")
                    self.per = True
                    self.loadaddress()#load images address

                else:
                    print("Did not get all permissions")
                    self.per = False

            request_permissions([Permission.WRITE_EXTERNAL_STORAGE, Permission.READ_EXTERNAL_STORAGE], call__back)
        else:
            self.per = True
            self.loadaddress()

    def loadaddress(self):
        if platform == 'android':
            print("loading....")
            self.help_str.get_screen('imagepick').ids.rv.data = [{'source': file} for file in glob.glob("/storage/emulated/0/DCIM/Camera/*.*")]
            print(self.help_str.get_screen('imagepick').ids.rv.data)
            print(len(self.help_str.get_screen('imagepick').ids.rv.data))

            self.imagepicscreen = 'ready'  # now screen is ready to display

            self.help_str.get_screen('imagepick').manager.current = 'imagepick'

        else:

            from plyer  import storagepath
            dict_list = []

            ll = []

            for root, dirs, files in os.walk(str(storagepath.get_pictures_dir())):
                for file in files:
                    if(file.endswith(".jpeg"))  or (file.endswith(".png")) :

                        ss =  str(os.path.join(root,file))

                        ll.append(ss)

            li = ll #in case odf android ll = [ ]

            for image_path in li : #self.get_image_paths():
                print(image_path)

                dict_list.append(dict({"source": image_path}))

                self.help_str.get_screen('imagepick').ids.rv.data = dict_list

            self.imagepicscreen = 'ready'

            self.help_str.get_screen('imagepick').manager.current = 'imagepick'


    def on_tab_switch(self,instance_tabs,instance_tab,instance_tab_label,tab_text):
        #instance_tab.ids.label.text = 'hello'
        print(instance_tabs , instance_tab , instance_tab_label , tab_text )


k = DemoApp()
k.run()

Robert

unread,
May 16, 2021, 12:42:11 PM5/16/21
to Kivy users support
ReferenceError: weakly-referenced object no longer exists

purushottam yadav

unread,
May 18, 2021, 2:56:41 PM5/18/21
to Kivy users support
bro
I have created new virtual environment with python 3.9.5 and installed kivy 2.0.0 again but i dont know what is wrong with building apk .
I am still getting this error .


05-19 00:23:51.977 16177 16365 I python  :  Traceback (most recent call last):
05-19 00:23:51.977 16177 16365 I python  :    File "/home/purushottam2/Desktop/myupdateproject/yyy/.buildozer/android/app/main.py", line 372, in <module>
05-19 00:23:51.977 16177 16365 I python  :    File "/home/purushottam2/Desktop/myupdateproject/yyy/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/myapp/kivy/app.py", line 855, in run
05-19 00:23:51.977 16177 16365 I python  :    File "/home/purushottam2/Desktop/myupdateproject/yyy/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/myapp/kivy/base.py", line 504, in runTouchApp
05-19 00:23:51.978 16177 16365 I python  :    File "/home/purushottam2/Desktop/myupdateproject/yyy/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/myapp/kivy/core/window/window_sdl2.py", line 747, in mainloop
05-19 00:23:51.978 16177 16365 I python  :    File "/home/purushottam2/Desktop/myupdateproject/yyy/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/myapp/kivy/core/window/window_sdl2.py", line 479, in _mainloop
05-19 00:23:51.978 16177 16365 I python  :    File "/home/purushottam2/Desktop/myupdateproject/yyy/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/myapp/kivy/base.py", line 339, in idle
05-19 00:23:51.978 16177 16365 I python  :    File "/home/purushottam2/Desktop/myupdateproject/yyy/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/myapp/kivy/clock.py", line 591, in tick
05-19 00:23:51.979 16177 16365 I python  :    File "kivy/_clock.pyx", line 384, in kivy._clock.CyClockBase._process_events
05-19 00:23:51.979 16177 16365 I python  :    File "kivy/_clock.pyx", line 414, in kivy._clock.CyClockBase._process_events
05-19 00:23:51.979 16177 16365 I python  :    File "kivy/_clock.pyx", line 412, in kivy._clock.CyClockBase._process_events
05-19 00:23:51.979 16177 16365 I python  :    File "kivy/_clock.pyx", line 154, in kivy._clock.ClockEvent.tick
05-19 00:23:51.980 16177 16365 I python  :    File "kivy/_clock.pyx", line 86, in kivy._clock.ClockEvent.get_callback
05-19 00:23:51.980 16177 16365 I python  :    File "/home/purushottam2/Desktop/myupdateproject/yyy/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/myapp/kivy/weakmethod.py", line 56, in is_dead
05-19 00:23:51.980 16177 16365 I python  :  ReferenceError: weakly-referenced object no longer exists
05-19 00:23:51.980 16177 16365 I python  : Python for android ended.



============================================
python --version  gives 

Python 3.9.5

=============================================

pip list gives 

Package            Version
------------------ ---------
appdirs            1.4.4
buildozer          1.2.0
certifi            2020.12.5
chardet            4.0.0
colorama           0.4.4
Cython             0.29.23
distlib            0.3.1
docutils           0.17.1
ffpyplayer         4.3.2
filelock           3.0.12
idna               2.10
importlib-metadata 4.0.1
Jinja2             3.0.0
Kivy               2.0.0
Kivy-examples      2.0.0
Kivy-Garden        0.1.4
kivymd             0.104.1
MarkupSafe         2.0.1
pep517             0.6.0
pexpect            4.8.0
Pillow             8.2.0
pip                21.1.1
plyer              2.0.0
ptyprocess         0.7.0
Pygments           2.9.0
pytoml             0.1.21
requests           2.25.1
setuptools         56.0.0
sh                 1.14.2
six                1.16.0
toml               0.10.2
urllib3            1.26.4
virtualenv         20.4.6
zipp               3.4.1


=================================
pip freeze gives   

appdirs==1.4.4
buildozer==1.2.0
certifi==2020.12.5
chardet==4.0.0
colorama==0.4.4
Cython==0.29.23
distlib==0.3.1
docutils==0.17.1
ffpyplayer==4.3.2
filelock==3.0.12
idna==2.10
importlib-metadata==4.0.1
Jinja2==3.0.0
Kivy==2.0.0
Kivy-examples==2.0.0
Kivy-Garden==0.1.4
kivymd==0.104.1
MarkupSafe==2.0.1
pep517==0.6.0
pexpect==4.8.0
Pillow==8.2.0
plyer==2.0.0
ptyprocess==0.7.0
Pygments==2.9.0
pytoml==0.1.21
requests==2.25.1
sh==1.14.2
six==1.16.0
toml==0.10.2
urllib3==1.26.4
virtualenv==20.4.6
zipp==3.4.1

==========================================buildozer file =============================

[app]

# (str) Title of your application
title = kApplication

# (str) Package name
package.name = myapp

# (str) Package domain (needed for android/ios packaging)
package.domain = org.test

# (str) Source code where the main.py live
source.dir = .

# (list) Source files to include (let empty to include all the files)
source.include_exts = 

# (list) List of inclusions using pattern matching
source.include_patterns = *

# (list) Source files to exclude (let empty to not exclude anything)
#source.exclude_exts = spec

# (list) List of directory to exclude (let empty to not exclude anything)
#source.exclude_dirs = tests, bin

# (list) List of exclusions using pattern matching
#source.exclude_patterns = license,images/*/*.jpg

# (str) Application versioning (method 1)
version = 0.1

# (str) Application versioning (method 2)
# version.regex = __version__ = ['"](.*)['"]
# version.filename = %(source.dir)s/main.py

# (list) Application requirements
# comma separated e.g. requirements = sqlite3,kivy
requirements = python3 ,Kivy==2.0.0, kivymd==0.104.1, sdl2_ttf==2.0.15 ,  plyer, android ,pil,jnius  

# (str) Custom source folders for requirements
# Sets custom source for any requirements with recipes
# requirements.source.kivy = ../../kivy

# (list) Garden requirements
#garden_requirements = xcamera

# (str) Presplash of the application
#presplash.filename = %(source.dir)s/data/presplash.png

# (str) Icon of the application
#icon.filename = %(source.dir)s/data/icon.png

# (str) Supported orientation (one of landscape, sensorLandscape, portrait or all)
orientation =  all

# (list) List of service to declare
#services = NAME:ENTRYPOINT_TO_PY,NAME2:ENTRYPOINT2_TO_PY

#
# OSX Specific
#

#
# author = © Copyright Info

# change the major version of python used by the app
osx.python_version = 3

# Kivy version to use
osx.kivy_version = 1.9.1

#
# Android specific
#

# (bool) Indicate if the application should be fullscreen or not
fullscreen = 0

# (string) Presplash background color (for new android toolchain)
# Supported formats are: #RRGGBB #AARRGGBB or one of the following names:
# red, blue, green, black, white, gray, cyan, magenta, yellow, lightgray,
# darkgray, grey, lightgrey, darkgrey, aqua, fuchsia, lime, maroon, navy,
# olive, purple, silver, teal.
#android.presplash_color = #FFFFFF

# (list) Permissions
android.permissions = INTERNET, WRITE_EXTERNAL_STORAGE ,READ_EXTERNAL_STORAGE ,  ACCESS_NETWORK_STATE

# (int) Target Android API, should be as high as possible.
#android.api = 27
android.api = 27
# (int) Minimum API your APK will support.
#android.minapi = 21
android.minapi = 21
# (int) Android SDK version to use
#android.sdk = 20
android.sdk = 24
# (str) Android NDK version to use
#android.ndk = 19b
android.ndk = 19b
# (int) Android NDK API to use. This is the minimum API your app will support, it should usually match android.minapi.
#android.ndk_api = 21

# (bool) Use --private data storage (True) or --dir public storage (False)
#android.private_storage = True

# (str) Android NDK directory (if empty, it will be automatically downloaded.)
#android.ndk_path =

# (str) Android SDK directory (if empty, it will be automatically downloaded.)
#android.sdk_path =

# (str) ANT directory (if empty, it will be automatically downloaded.)
#android.ant_path =

# (bool) If True, then skip trying to update the Android sdk
# This can be useful to avoid excess Internet downloads or save time
# when an update is due and you just want to test/build your package
# android.skip_update = False

# (bool) If True, then automatically accept SDK license
# agreements. This is intended for automation only. If set to False,
# the default, you will be shown the license when first running
# buildozer.
# android.accept_sdk_license = False

# (str) Android entry point, default is ok for Kivy-based app
#android.entrypoint = org.renpy.android.PythonActivity

# (str) Android app theme, default is ok for Kivy-based app
# android.apptheme = "@android:style/Theme.NoTitleBar"

# (list) Pattern to whitelist for the whole project
#android.whitelist =

# (str) Path to a custom whitelist file
#android.whitelist_src =

# (str) Path to a custom blacklist file
#android.blacklist_src =

# (list) List of Java .jar files to add to the libs so that pyjnius can access
# their classes. Don't add jars that you do not need, since extra jars can slow
# down the build process. Allows wildcards matching, for example:
# OUYA-ODK/libs/*.jar
#android.add_jars = foo.jar,bar.jar,path/to/more/*.jar

# (list) List of Java files to add to the android project (can be java or a
# directory containing the files)
#android.add_src =

# (list) Android AAR archives to add (currently works only with sdl2_gradle
# bootstrap)
#android.add_aars = support-compat-28.0.0.aar

# (list) Gradle dependencies to add (currently works only with sdl2_gradle
# bootstrap)
#android.gradle_dependencies =
android.gradle_dependencies = 'com.google.firebase:firebase-ads:10.2.0'

# (list) add java compile options
# this can for example be necessary when importing certain java libraries using the 'android.gradle_dependencies' option
# android.add_compile_options = "sourceCompatibility = 1.8", "targetCompatibility = 1.8"

# (list) Gradle repositories to add {can be necessary for some android.gradle_dependencies}
# please enclose in double quotes 
# e.g. android.gradle_repositories = "maven { url 'https://kotlin.bintray.com/ktor' }"
#android.add_gradle_repositories =

# (list) packaging options to add 
# can be necessary to solve conflicts in gradle_dependencies
# please enclose in double quotes 
# e.g. android.add_packaging_options = "exclude 'META-INF/common.kotlin_module'", "exclude 'META-INF/*.kotlin_module'"
#android.add_gradle_repositories =

# (list) Java classes to add as activities to the manifest.
#android.add_activities = com.example.ExampleActivity

# (str) OUYA Console category. Should be one of GAME or APP
# If you leave this blank, OUYA support will not be enabled
#android.ouya.category = GAME

# (str) Filename of OUYA Console icon. It must be a 732x412 png image.
#android.ouya.icon.filename = %(source.dir)s/data/ouya_icon.png

# (str) XML file to include as an intent filters in <activity> tag
#android.manifest.intent_filters =

# (str) launchMode to set for the main activity
#android.manifest.launch_mode = standard

# (list) Android additional libraries to copy into libs/armeabi
#android.add_libs_armeabi = libs/android/*.so
#android.add_libs_armeabi_v7a = libs/android-v7/*.so
#android.add_libs_arm64_v8a = libs/android-v8/*.so
#android.add_libs_x86 = libs/android-x86/*.so
#android.add_libs_mips = libs/android-mips/*.so

# (bool) Indicate whether the screen should stay on
# Don't forget to add the WAKE_LOCK permission if you set this to True
#android.wakelock = False

# (list) Android application meta-data to set (key=value format)
#android.meta_data =
android.meta_data = com.google.android.gms.ads.APPLICATION_ID=ca-app-pub-3940256099942544~3347511713

# (list) Android library project to add (will be added in the
# project.properties automatically.)
#android.library_references =

# (list) Android shared libraries which will be added to AndroidManifest.xml using <uses-library> tag
#android.uses_library =

# (str) Android logcat filters to use
#android.logcat_filters = *:S python:D

# (bool) Copy library instead of making a libpymodules.so
#android.copy_libs = 1

# (str) The Android arch to build for, choices: armeabi-v7a, arm64-v8a, x86, x86_64
android.arch = armeabi-v7a

# (int) overrides automatic versionCode computation (used in build.gradle)
# this is not the same as app version and should only be edited if you know what you're doing
# android.numeric_version = 1

#
# Python for android (p4a) specific
#

# (str) python-for-android fork to use, defaults to upstream (kivy)
#p4a.fork = <your username>

# (str) python-for-android branch to use, defaults to master
#p4a.branch = develop
p4a.branch = master

# (str) python-for-android git clone directory (if empty, it will be automatically cloned from github)
#p4a.source_dir =

# (str) The directory in which python-for-android should look for your own build recipes (if any)
#p4a.local_recipes =

# (str) Filename to the hook for p4a
#p4a.hook =

# (str) Bootstrap to use for android builds
# p4a.bootstrap = sdl2

# (int) port number to specify an explicit --port= p4a argument (eg for bootstrap flask)
#p4a.port =


#
# iOS specific
#

# (str) Path to a custom kivy-ios folder
#ios.kivy_ios_dir = ../kivy-ios
# Alternately, specify the URL and branch of a git checkout:
ios.kivy_ios_branch = master

# Another platform dependency: ios-deploy
# Uncomment to use a custom checkout
#ios.ios_deploy_dir = ../ios_deploy
# Or specify URL and branch
ios.ios_deploy_branch = 1.7.0

# (str) Name of the certificate to use for signing the debug version
# Get a list of available identities: buildozer ios list_identities
#ios.codesign.debug = "iPhone Developer: <lastname> <firstname> (<hexstring>)"

# (str) Name of the certificate to use for signing the release version
#ios.codesign.release = %(ios.codesign.debug)s


[buildozer]

# (int) Log level (0 = error only, 1 = info, 2 = debug (with command output))
log_level = 2

# (int) Display warning if buildozer is run as root (0 = False, 1 = True)
warn_on_root = 1

# (str) Path to build artifact storage, absolute or relative to spec file
# build_dir = ./.buildozer

# (str) Path to build output (i.e. .apk, .ipa) storage
# bin_dir = ./bin

#    -----------------------------------------------------------------------------
#    List as sections
#
#    You can define all the "list" as [section:key].
#    Each line will be considered as a option to the list.
#    Let's take [app] / source.exclude_patterns.
#    Instead of doing:
#
#[app]
#source.exclude_patterns = license,data/audio/*.wav,data/images/original/*
#
#    This can be translated into:
#
#[app:source.exclude_patterns]
#license
#data/audio/*.wav
#data/images/original/*
#


#    -----------------------------------------------------------------------------
#    Profiles
#
#    You can extend section / key with a profile
#    For example, you want to deploy a demo version of your application without
#    HD content. You could first change the title to add "(demo)" in the name
#    and extend the excluded directories to remove the HD content.
#
#[app@demo]
#title = My Application (demo)
#
#[app:source.exclude_patterns@demo]
#images/hd/*
#
#    Then, invoke the command line with the "demo" profile:
#
#buildozer --profile demo android debug

Robert

unread,
May 18, 2021, 5:22:50 PM5/18/21
to Kivy users support
FYI Buildozer doesn't care what is installed locally with pip3

The only causes I have ever seen for this error is using kivy < 2.0.0  and some KivyMD versions.
I notice KivyMD is still fixing weakref errors https://kivymd.readthedocs.io/en/latest/changelog/index.html and you are using the version before the latest fix.

I can't help you with this.
I would try the master KivyMD, but be aware the functionality will have changed - I can't say if this will impact you app. Test on the desktop first.

If you still have issues talk to the KivyMD developers - they respond best to small clear examples on an issue.
Message has been deleted

purushottam yadav

unread,
May 25, 2021, 1:48:27 PM5/25/21
to Kivy users support
I fixed this weak_method bug using   https://github.com/Lauszus/kivy/commit/09baddd94f595e4904e27ee3d006efff999ff1d0 .

Still the situation is same on android but everything works fine on ubuntu .
I noticed somethings on terminal while buildozer is building  apk .see the images below . this could be the reason . 

1) I mentioned for kivy==2.0.0 in the spec file but it is downloading kivy 1.11.1 .
 why is it happening ?
2) Can this be reason for the  slow performance of recycleview ?
WhatsApp Image 2021-05-25 at 11.09.47 PM (8).jpeg

Robert

unread,
May 25, 2021, 3:33:42 PM5/25/21
to Kivy users support
downloading kivy 1.11.1  would give the weakref issue.

Reply all
Reply to author
Forward
0 new messages