代码之家  ›  专栏  ›  技术社区  ›  felinx94

DeepL API和MDFileManager无法在KivyMD 1.1.1 android应用程序上运行

  •  0
  • felinx94  · 技术社区  · 2 年前

    我正在为Android构建一个KivyMD python应用程序。我尝试访问DeepL API。当我使用“requests”时,它在我的桌面和android设备上(当使用buildozer编译时)都能完美工作。但当我使用“deepl”库而不是“requests”时,它在我的桌面上有效,但在我的android设备上无效。我想使用“deepl”库,因为翻译比使用“requests”库时更好。

    我的安卓设备是小米小米9T

    MIUI版本:MIUI Global 12.0.5稳定版12.0.5.0(QFJEUXM)

    安卓版本:10 QKQ1.190825.002

    我正在使用:

    基维2.1.0

    基维姆德1.1.1

    深度1.14.0

    这是我的代码:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    import traceback
    
    import requests
    import deepl
    import ssl
    ssl._create_default_https_context = ssl._create_unverified_context
    
    class DeeplTranslator:
        def __init__(self):
            self.auth_key = "my_auth_key"
            self.url = 'https://api-free.deepl.com/v2/translate'
            self.translator = deepl.Translator(self.auth_key)
    
        def translate(self, text_to_translate, target_lang, source_lang):
            # Requests method
            """
            params = {
                'auth_key': self.auth_key,
                'text': text_to_translate,
                'target_lang': target_lang
            }
            
            try:
                response = requests.post(self.url, data=params)
                response.raise_for_status()  # Raise an exception for 4xx or 5xx response status codes
                source_lang = response.json()['translations'][0]['detected_source_language']
                translation = response.json()['translations'][0]['text']
                return source_lang, translation
            except (requests.exceptions.RequestException, KeyError, IndexError) as e:
                print(f"An error occurred while translating the text: {e}")
                return None, None
            """
    
            # DeepL method
            try:
                result = self.translator.translate_text(text_to_translate, target_lang=target_lang, source_lang=source_lang, formality='less')
                translation = result.text
                return source_lang, translation
            except Exception as e:
                traceback.print_exc()
                print(str(e))
                return None, None
    
    
    class FlasholatorApp(MDApp):
        def build(self):
            return Builder.load_file("main.kv")
    
    
        def on_start(self):
            self.deepl_translator = DeeplTranslator()
    
            if platform == 'android':
              from android.permissions import request_permissions, Permission
              request_permissions([
                Permission.WRITE_EXTERNAL_STORAGE, 
                Permission.READ_EXTERNAL_STORAGE,
                Permission.INTERNET
              ])
            
    
            self.device_root_path = "/storage/emulated/0" if platform=='android' else os.environ['HOME']
    
        def translate(self, text_to_translate, target_lang, source_lang):
            if text_to_translate!=self.text_to_translate and text_to_translate!="":
                self.translate_tab.ids.translate_button.disabled = True
                source_lang, translation = self.deepl_translator.translate(text_to_translate, target_lang, source_lang)
                self.translate_tab.ids.translate_button.disabled = False
            else:
                source_lang, translation = None, None
    
            if source_lang and translation:
                self.translate_tab.ids.translated_text.text = translation
                self.text_to_translate, self.target_lang = text_to_translate, target_lang
                self.translation, self.source_lang = translation, source_lang
    
            
    

    以下是我的buildozer.spec文件权限:

    android.permissions = WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE, INTERNET, SSL

    以下是我得到的错误:

    Traceback (most recent call last):
    04-26 01:08:16.114  5121  5497 D PowerCheckerService: onBatteryChanged, mBatteryLevel = 58, status = 2, level = 58, plug = 2, scale = 100
    04-26 01:08:16.115  3396  3396 I BatteryInfoReceiver: ACTION_BATTERY_CHANGED
    04-26 01:08:16.115 23866 24365 I python  :    File "/media/felix/2bbafeba-9213-47d8-8cff-0f44dd5ad585/home/felix/Documents/Informatique/Python/Flasholator/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/flasholatorApp/armeabi-v7a/deepl/http_client.py", line 110, in request_with_backoff
    04-26 01:08:16.115 23866 24365 I python  :    File "/media/felix/2bbafeba-9213-47d8-8cff-0f44dd5ad585/home/felix/Documents/Informatique/Python/Flasholator/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/flasholatorApp/armeabi-v7a/deepl/http_client.py", line 251, in _generate_user_agent
    04-26 01:08:16.115 23866 24365 I python  :    File "/media/felix/2bbafeba-9213-47d8-8cff-0f44dd5ad585/home/felix/Documents/Informatique/Python/Flasholator/.buildozer/android/platform/build-armeabi-v7a/build/other_builds/python3/armeabi-v7a__ndk_target_21/python3/Lib/platform.py", line 1235, in platform
    04-26 01:08:16.115 23866 24365 I python  :    File "/media/felix/2bbafeba-9213-47d8-8cff-0f44dd5ad585/home/felix/Documents/Informatique/Python/Flasholator/.buildozer/android/platform/build-armeabi-v7a/build/other_builds/python3/armeabi-v7a__ndk_target_21/python3/Lib/platform.py", line 196, in libc_ver
    04-26 01:08:16.115 23866 24365 I python  :  IsADirectoryError: [Errno 21] Is a directory: '/data/data/org.felixmortas.flasholatorapp/files/app'
    04-26 01:08:16.115 23866 24365 I python  :  
    04-26 01:08:16.115 23866 24365 I python  :  The above exception was the direct cause of the following exception:
    04-26 01:08:16.115 23866 24365 I python  :  
    04-26 01:08:16.116 23866 24365 I python  :  Traceback (most recent call last):
    04-26 01:08:16.116 23866 24365 I python  :    File "/media/felix/2bbafeba-9213-47d8-8cff-0f44dd5ad585/home/felix/Documents/Informatique/Python/Flasholator/.buildozer/android/app/DeeplTranslator.py", line 44, in translate
    04-26 01:08:16.116 23866 24365 I python  :    File "/media/felix/2bbafeba-9213-47d8-8cff-0f44dd5ad585/home/felix/Documents/Informatique/Python/Flasholator/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/flasholatorApp/armeabi-v7a/deepl/translator.py", line 823, in translate_text
    04-26 01:08:16.116 23866 24365 I python  :    File "/media/felix/2bbafeba-9213-47d8-8cff-0f44dd5ad585/home/felix/Documents/Informatique/Python/Flasholator/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/flasholatorApp/armeabi-v7a/deepl/translator.py", line 535, in _api_call
    04-26 01:08:16.116 23866 24365 I python  :    File "/media/felix/2bbafeba-9213-47d8-8cff-0f44dd5ad585/home/felix/Documents/Informatique/Python/Flasholator/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/flasholatorApp/armeabi-v7a/deepl/http_client.py", line 121, in request_with_backoff
    04-26 01:08:16.116 23866 24365 I python  :  deepl.exceptions.DeepLException: Error occurred while preparing request: [Errno 21] Is a directory: '/data/data/org.felixmortas.flasholatorapp/files/app'
    04-26 01:08:16.116 23866 24365 I python  : Error occurred while preparing request: [Errno 21] Is a directory: '/data/data/org.felixmortas.flasholatorapp/files/app'
    
    

    以下是我的android日志:

    04-25 00:00:22.639 12716 12716 V GrantPermissionsActivity: Permission grant result requestId=292789256274468049 callingUid=10501 callingPackage=org.felixmortas.flasholatorapp permission=android.permission.WRITE_EXTERNAL_STORAGE isImplicit=false result=5
    04-25 00:00:22.641  1686  1935 W ActivityManager: setHasOverlayUi called on unknown pid: 12318
    04-25 00:00:22.642  1686  2303 I MiuiNetworkPolicy: removeUidState uid = 10501
    04-25 00:00:22.642  1686  2303 I MiuiNetworkPolicy: updateMLUid uid:10501,old:2,new:20
    04-25 00:00:22.642  1686  2303 I MiuiNetworkPolicy: isMLEnabled state:2,uid:10501,connect:CONNECTED
    04-25 00:00:22.642  1686  2303 I MiuiNetworkPolicy: isMLEnabled state:20,uid:10501,connect:CONNECTED
    04-25 00:00:22.642  1686  2303 I MiuiNetworkPolicy: updateUidState uid = 10096, uidState = 2
    04-25 00:00:22.642  1686  2303 I MiuiNetworkPolicy: updateMLUid uid:10096,old:6,new:2
    04-25 00:00:22.642  1686  2303 I MiuiNetworkPolicy: isMLEnabled state:6,uid:10096,connect:CONNECTED
    04-25 00:00:22.642  1686  2303 I MiuiNetworkPolicy: isMLEnabled state:2,uid:10096,connect:CONNECTED
    04-25 00:00:22.643  2509  2509 D EventBus: [2509, u0] send(AppTransitionFinishedEvent)
    04-25 00:00:22.643  2509  2509 D EventBus: [2509, u0]  -> ForcedResizableInfoActivityController [0x77137cc, P1] onBusEvent(AppTransitionFinishedEvent)
    04-25 00:00:22.643   522   522 I hwservicemanager: getTransport: Cannot find entry vendor.qti.hardware.servicetracker@1.0::IServicetracker/default in either framework or device manifest.
    04-25 00:00:22.643  2509  2509 D EventBus: [2509, u0] onBusEvent(AppTransitionFinishedEvent) duration: 48 microseconds, avg: 60
    04-25 00:00:22.647  1686  4701 V LocSvc_HIDL_IzatProvider_jni: [onRemoveRequest][180] [HC] =>> [HS]
    04-25 00:00:22.647   718   718 V LocSvc_HIDL_IzatProvider: [onRemoveRequest][210] [HS] <<<<= [HC]
    04-25 00:00:22.647   718   718 I IzatSvc_IzatManager: LocTech-Label :: IZATMANAGER :: Remove Request In
    04-25 00:00:22.647   718   718 I IzatSvc_IzatManager: LocTech-Value :: Provider: 2, Num Updates: 2147483647, TTFF: 0, Interval: 1000, Displacement: 0.000000, Horizontal Accuracy: 1, Altitude Accuracy: 2, Bearing Accuracy: 2
    04-25 00:00:22.647  1686  1946 V LocSvc_HIDL_OsNpGlue_jni: [onStopRequest][73] [HC] <<= [HS]
    04-25 00:00:22.654  1686  1936 I Timeline: Timeline: App_transition_ready time:781897641
    04-25 00:00:22.655  4784  5146 I FusedLocationProvider: onSetRequest
    04-25 00:00:22.655  4784  5189 I AbsoluteLocationDispatcher: request type:0
    04-25 00:00:22.655 12716 12716 V GrantPermissionsActivity: Permission grant result requestId=292789256274468049 callingUid=10501 callingPackage=org.felixmortas.flasholatorapp permission=android.permission.READ_EXTERNAL_STORAGE isImplicit=false result=5
    
    

    在我的android设备上构建应用程序时,它会问我是否可以访问我的存储,我说可以。

    此外,我的MDFileManager没有在我的android设备上打开,而是在我的桌面上。也许问题与此有关?

    以下是我所在班级FlasholatorApp(MDApp)中MDFileManager的代码:

    class FlasholatorApp(MDApp):
        ...
        def open_save_database_folder_selector(self):
            def save_database(path):    
                print("Sauvegarde du paquet de carte ...")
                # Pass the file path to save_database() method
                self.flashcard_collection.save_database(path)
                print("Paquet de cartes sauvegardé avec succès !")
    
                # Close the file manager
                file_manager.close()
    
            # Create a file manager instance
            file_manager = MDFileManager(
                exit_manager=lambda x: file_manager.close(),
                select_path=save_database,
                ext=[".db"],
                selector="folder"
            )
    
            # Open the file manager
            file_manager.show(self.device_root_path) # Starting path
    

    当我试图通过单击按钮打开MDFileManager时,它不会崩溃,但不会执行任何操作。

    有人知道问题的真正原因吗?

    此外,基于此帖子: https://stackoverflow.com/questions/64849485/why-is-filemanager-not-working-on-android-kivymd

    我更改了 self.device_root_path 的MDFileManager到 self.primary_ext_storage

    自身主要外部存储 定义如下:

    from android.storage import primary_external_storage_path
    self.primary_ext_storage = os.environ['HOME'] if platform!='android' else primary_external_storage_path()
    

    但这并不能改变任何事情。当我试图通过单击按钮打开MDFileManager时,它不会崩溃,但不会执行任何操作。

    非常感谢。

    0 回复  |  直到 2 年前
        1
  •  0
  •   Gaze    2 年前

    库正在试图弄清楚运行在哪个平台上,这导致了您观察到的问题( platform.platform() 正在投掷)。更改实例化您的 deepl.Translator 应该解决这个问题。

    从…起

    self.translator = deepl.Translator(self.auth_key)

    self.translator = deepl.Translator(self.auth_key, send_platform_info=False)

    推荐文章