我正在为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时,它不会崩溃,但不会执行任何操作。
非常感谢。