Kivy y android compartieron preferencias

Estoy buscando un método para almacenar la configuración de forma persistente en el dispositivo Android, desde el marco Kivy.

Encontré la documentación de Kivy, en general informativa, vaga en esta área en particular. Menciona tres métodos (lo siento, no tengo suficiente reputación para proporcionar enlaces fáciles de usar , se proporcionan rutas relativas a kivy.org , me alegraría que alguien pudiera arreglar esos enlaces ):

  1. [Almacenamiento] ./docs/api-kivy.storage.html#module-kivy.storage
  2. [Configuración] ./docs/api-kivy.uix.settings.html
  3. [Config] ./docs/api-kivy.config.html

Además de eso, soy consciente de que podría almacenar datos en un archivo, mediante pickle o base de datos, pero me gustaría usar las sharedpreferences específicamente, o al menos cualquier almacenamiento persistente específico de Android / Kivy.

  1. Sin embargo, no pude encontrar ninguna comparación o explicación sobre cómo son diferentes y cómo se usan. ¿Alguien podría arrojar algo de luz, ya los había usado?

  2. En realidad, estoy seguro al 80% de que ninguno de estos métodos usa las preferencias compartidas de Android, por lo tanto, pensé en usar jnius (4), y para hacerlo lo he intentado (métodos 1,2 / 3?, 4), basado en Ejemplo de simple hola mundo:

     from kivy.app import App from kivy.uix.button import Button import jnius from kivy.config import Config from kivy.storage.dictstore import DictStore class MyApp(App): def build(self): path = "DEFAULT" try: path = Config.get('kivy', 'my_important_variable') print "\t\t\t KIVY 1:", Config.get('kivy', 'my_important_variable') except Exception as err: print ("KIVY, 1, error: {}".format(repr(err))) try: store = DictStore("MY_SETTINGS") path = store.get("my_important_variable") print "\t\t\t KIVY 2:", path except KeyError as err: print ("KIVY, 2, error: {}".format(repr(err))) try: prefs_m = jnius.autoclass('android.preference.PreferenceManager') prefs = prefs_m.getSharedPreferences() path = prefs.getString("my_important_variable", None) print "\t\t\t KIVY 3:", path except jnius.jnius.JavaException as err: print ("KIVY, 3, error: {}".format(repr(err))) btn1 = Button(text=path) btn1.bind(on_press=app.callback) # return btn1 def callback(self, instance): print('The button  is being pressed, SAVING...' % instance.text) try: Config.set('kivy', 'my_important_variable', "my_value_1") except Exception as err: print ("KIVY, 4, error: {}".format(repr(err))) try: store = DictStore("MY_SETTINGS") store.put("MY_SETTINGS", my_important_variable="my_value_2") except Exception as err: print ("KIVY, 5, error: {}".format(repr(err))) try: prefs_c = jnius.autoclass('android.content.SharedPreferences') prefs_m = jnius.autoclass('android.preference.PreferenceManager') prefs = prefs_m.getSharedPreferences() prefs_e = prefs.Editor() prefs_e.putString("my_important_variable", "my_value_3") prefs_e.commit() except Exception as err: print ("KIVY, 6, error: {}".format(repr(err))) try: context = jnius.autoclass('android.content.Context') # do I actually get context or a class here? prefs = context.getPreferences(0).edit(); prefs.putString("my_important_variable", "my_value_4") prefs.commit() except Exception as err: print ("KIVY, 7, error: {}".format(repr(err))) if __name__ == '__main__': app = MyApp() app.run() 

Y aquí están los resultados de Logcat.

 ... each time app is launched I/python ( 5973): KIVY, 1, error: No option 'my_important_variable' in section: 'kivy' I/python ( 5973): KIVY, 2, error: KeyError('my_important_variable',) I/python ( 5973): KIVY, 3, error: JavaException('Unable to find a None method!',) ... button pressed I/python ( 5973): The button  is being pressed, SAVING... I/python ( 5973): KIVY, 6, error: JavaException('Unable to find a None method!',) I/python ( 5973): KIVY, 7, error: AttributeError("type object 'android.content.Context' has no attribute 'getPreferences'",) 

Tenga en cuenta que 4, 5 “error msg’s” no fueron llamados, así que en teoría deberían haber funcionado, pero en el segundo lanzamiento recibo los mismos errores Me he quedado sin ideas de cómo romperlo.

Kivy.Config se utiliza para almacenar configuraciones relacionadas con la creación de instancias de la clase de la aplicación. Generalmente se coloca en la parte superior de su script de Python antes de que se importe cualquier otro módulo kivy. Este método no es específico de la plataforma, pero la ruta predeterminada al archivo de configuración cambia según la plataforma.

 from kivy.config import Config desktop=Config.getint('kivy', 'desktop') if desktop == 1: print "This app is being run on a desktop." 

DictStore es una clase de almacenamiento que almacena un diccionario en el disco. El argumento de nombre de archivo especifica el nombre del archivo donde se almacena el diccionario. Cuando se llama a la función get, se devuelve un diccionario de Python.

 from kivy.app import App from kivy.uix.button import Button from kivy.storage.dictstore import DictStore class TestApp(App): def build(self): try: store = DictStore(filename="MY_SETTINGS") dictionary = store.get("my_important_variable") print "\t\t\t KIVY 2: DictStore Succeeded", except KeyError as err: dictionary = {'name': 'None'} print ("KIVY, 2, error: {}".format(repr(err))) self.text = str(dictionary) btn1 = Button(text=self.text) btn1.bind(on_press=self.callback) # return btn1 def callback(self, instance): print('The button <%s> is being pressed, SAVING...' % instance.text) try: store = DictStore(filename="MY_SETTINGS") store.put("my_important_variable", name="John") except Exception as err: print ("KIVY, 5, error: {}".format(repr(err))) if __name__ == '__main__': TestApp().run() 

Proporcionaré el código para acceder a las preferencias compartidas a continuación. Si está interesado en obtener más información, visite http://developer.android.com/guide/topics/data/data-storage.html y https://kivy.org/planet/2015/04/python-on%C2 % A0android /

 from kivy.app import App from kivy.uix.button import Button import jnius class TestApp(App): def build(self): try: PythonActivity = jnius.autoclass('org.renpy.android.PythonActivity') activity = PythonActivity.mActivity cntxt = activity.getApplicationContext() prefs = cntxt.getSharedPreferences("MY_PREFS", cntxt.MODE_PRIVATE ) print "KIVY ACQUIRED SHARED PREFS" myVar = prefs.getString("my_important_variable", "Default String") print "\tKIVY 3: Retrieved SharedPref" except jnius.jnius.JavaException as err: myVar="Error Loading Prefs." print ("KIVY, 3, error: {}".format(repr(err))) self.text = myVar btn1 = Button(text=self.text) btn1.bind(on_press=self.callback) # return btn1 def callback(self, instance): print('The button <%s> is being pressed, SAVING...' % instance.text) try: PythonActivity = jnius.autoclass('org.renpy.android.PythonActivity') activity = PythonActivity.mActivity cntxt = activity.getApplicationContext() prefs = cntxt.getSharedPreferences("MY_PREFS", cntxt.MODE_PRIVATE) editor = prefs.edit() editor.putString("my_important_variable", "This is important!") editor.commit() print "\tKIVY: Added string  to shared prefs." except Exception as err: print ("\tKIVY, 6, error: {}".format(repr(err))) if __name__ == '__main__': TestApp().run()