Kivy, jnius, android + SharedPreferences = CRASH - PullRequest
0 голосов
/ 25 сентября 2019

Привет всем, кто знает, что создание приложений на python для Android так фантастично, как если бы вы ели радугу с единорогами и у вас было радужное бешенство (О, Боже!).Во всяком случае, я пытаюсь пройти весь путь, потому что я должен закончить свою заявку!Это очень сложный путь, поэтому мне нужна ваша помощь!Когда мой трудный путь привел меня к сохранению некоторых значений ключа в памяти (например, реестра в Windows, чтобы программа могла считывать эти значения при каждом запуске программы), я столкнулся с темной, самой темной тьмой тьмы.Я пытался сохранить эти значения с помощью JSON, но приложение по-прежнему сбой.Итак, я прочитал о (Fking) Shared (Fking) предпочтениях и попытался использовать их, и они все еще терпят крах, но такого рода это не должно разрушить всю программу, потому что эти общие настройки являются своего рода родными для Android!Пожалуйста, помогите мне с такой проблемой - мне нужно сохранить некоторые значения в памяти Android-смартфона и прочитать эти значения при каждом запуске приложения, и это главный вопрос!

Это мой main.py:

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.anchorlayout import AnchorLayout
from kivy.metrics import dp, sp, pt
from kivy.properties import ObjectProperty, NumericProperty, StringProperty, BooleanProperty, ListProperty
from kivy.storage.jsonstore import JsonStore
from kivy.uix.textinput import TextInput
from kivy.uix.screenmanager import SlideTransition
from kivy.uix.screenmanager import NoTransition

from kivymd.theming import ThemeManager
from kivymd.toast.kivytoast import toast
from kivymd.textfields import MDTextField
from kivymd.label import MDLabel

import jnius

class keyinput(MDTextField):
    pass

class Manager(ScreenManager):
    def __init__(self, **kwargs):
        super(Manager, self).__init__(**kwargs)

        try:
            PythonActivity = jnius.autoclass('org.renpy.android.PythonActivity')
            activity = PythonActivity.mActivity
            cntxt = activity.getApplicationContext()
            prefs = cntxt.getSharedPreferences("MY_PREFS", cntxt.MODE_PRIVATE )
            myVar = prefs.getString("keyvalue", "Default String")
        except jnius.jnius.JavaException as err:
            myVar="Error Loading Prefs."
            print("KIVY, 3, error: {}".format(repr(err)))

        registeredkey = myVar

        if registeredkey != '12345678':
            self.transition = NoTransition()
            self.current = 'login_screen'
        else:
            self.transition = NoTransition()
            self.current = 'main_menu'

class LoginScreen(Screen):

    def keycheck(self):

        if self.kinput.text == '12345678':
            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("keyvalue", str(self.kinput.text))
                editor.commit()
            except Exception as err:
                print("\tKIVY, 6, error: {}".format(repr(err)))
            toast('KEY IS CORRECT')
            self.manager.transition = SlideTransition(direction='left', duration = .17)
            self.manager.current = 'main_menu'
        elif len(self.kinput.text) > 8:
            toast('Too much text!')
        else:
            toast('KEY IS INCORRECT!')

class MainMenu(Screen):

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

        kinput = ObjectProperty(None)

        self.menu_items = [
                {
                    "viewclass": "MDMenuItem",
                    "text": "text%d" % i,
                    "callback": self.callback,
                }
                for i in range(1, 3)
            ]

        self.menu_button = None

    def change_variable(self, value):
        print("\nvalue=", value)
        self.VARIABLE = value
        print("\tself.VARIABLE=", self.VARIABLE)

    def callback(self, *args):
        toast(args[0])

class MainApp(App):
    title = "KivyMD Demo and test app for new programms"
    theme_cls = ThemeManager()

    def build(self):
        return Manager()

if __name__ == "__main__":
    MainApp().run()

И вот мой main.kv:

#:import MDDropdownMenu kivymd.menus.MDDropdownMenu
#:import MDRaisedButton kivymd.button.MDRaisedButton
#:import MDLabel kivymd.label.MDLabel

<OptionalLabel@MDLabel>:
    halign: 'center'
    font_size: dp(12)

<MDRB@MDRaisedButton>:
    size_hint: None, None
    size: 3 * dp(48), dp(48)
    pos_hint: {'center_x': 0.5, 'center_y': 0.5}
    opposite_colors: True

<keyinput>:
    size_hint_x: 0.5
    halign: 'center'
    pos_hint: {'center_x': .5, 'center_y': .5}
    max_text_length: 8

<Manager>:
    LoginScreen:
        id: login_screen
        name: 'login_screen'
    MainMenu:
        id: main_menu
        name: 'main_menu'

<LoginScreen>:
    kinput: kinput
    AnchorLayout:
        anchor_y: 'center'
        BoxLayout:
            orientation: 'vertical'
            size_hint: 0.5, 0.5
            pos_hint: {'center_x': 0.5, 'center_y': 0.5}
            spacing: dp(10)
            MDRB:
                text: 'Login'
                on_release:
                    root.keycheck()
            keyinput:
                id: kinput
                hint_text: "Login password"

<MainMenu>:
    AnchorLayout:
        anchor_y: 'center'
        BoxLayout:
            orientation: 'vertical'
            size_hint: 0.5, 0.5
            pos_hint: {'center_x': 0.5, 'center_y': 0.5}
            spacing: dp(10)
            OptionalLabel:
                text: 'You have logged in'
...