Skip to main content
 首页 » 编程设计

android之Kivy:AsyncImage 和 Urllib 不会在 Android 上打开任何 url

2025年01月19日39jackei

我最近开始使用我已经在我的电脑上用 kivy 编写的一些程序来定位 android,但是在我的手机上构建和安装之后,我发现 urllib 似乎不接受我提供给它的任何 url,尽管事实上它在我的电脑上完美运行。此外,任何使用 urllib 连接到互联网的 kivy 小部件都以完全相同的方式失败。

下面是一些示例代码:

from kivy.app import App 
from kivy.uix.image import AsyncImage 
 
class TestApp(App): 
    def build(self): 
        return AsyncImage(source="http://kivy.org/logos/kivy-logo-black-64.png") 
 
TestApp().run() 

当应用程序运行时,这会出现在 logcat 中:

11-07 15:50:10.400  3741  4686 I python  : [INFO   ] [GL          ]  
Using the "OpenGL ES 2" graphics system 
11-07 15:50:10.400  3741  4686 I python  : [INFO   ] [GL          ]  
Backend used <gl> 
11-07 15:50:10.410  3741  4686 I python  : [INFO   ] [GL          ]  
OpenGL version <b'OpenGL ES 3.1 V@140.0 (GIT@Ifd751822f5)'> 
11-07 15:50:10.410  3741  4686 I python  : [INFO   ] [GL          ]  
OpenGL vendor <b'Qualcomm'> 
11-07 15:50:10.410  3741  4686 I python  : [INFO   ] [GL          ]  
OpenGL renderer <b'Adreno (TM) 420'> 
11-07 15:50:10.410  3741  4686 I python  : [INFO   ] [GL          ]  
OpenGL parsed version: 3, 1 
11-07 15:50:10.410  3741  4686 I python  : [INFO   ] [GL          ]  
Texture max size <16384> 
11-07 15:50:10.410  3741  4686 I python  : [INFO   ] [GL          ]  
Texture max units <16> 
11-07 15:50:10.470  3741  4686 I python  : [INFO   ] [Window      ]  
auto add sdl2 input provider 
11-07 15:50:10.470  3741  4686 I python  : [INFO   ] [Window      ]  
virtual keyboard not allowed, single mode, not docked 
11-07 15:50:10.550  3741  4686 I python  : [INFO   ] [Loader      ]  
using a thread pool of 2 workers 
11-07 15:50:10.720  3741  4686 I python  : [WARNING] [Base        ]  
Unknown <android> provider 
11-07 15:50:10.720  3741  4686 I python  : [INFO   ] [Base        ] Start application main loop 
11-07 15:50:10.740  3741  4686 I python  : [ERROR  ] [Base        ] Failed to import "android" module. Could not remove android presplash. 
11-07 15:50:12.130  3741  4943 I python  : [ERROR  ] [Loader      ] Failed to load image <http://kivy.org/logos/kivy-logo-black-64.png> 
11-07 15:50:12.130  3741  4943 I python  : Traceback (most recent call last): 
11-07 15:50:12.130  3741  4943 I python  :   File "/data/user/0/org.lgt.lgt/files/app/crystax_python/site-packages/kivy/loader.py", line 317, in _load_urllib 
11-07 15:50:12.130  3741  4943 I python  :     fd = urllib_request.urlopen(filename) 
11-07 15:50:12.130  3741  4943 I python  :   File "/data/user/0/org.lgt.lgt/files/app/crystax_python/stdlib.zip/urllib/request.py", line 162, in urlopen 
11-07 15:50:12.130  3741  4943 I python  :     return opener.open(url, data, timeout) 
11-07 15:50:12.130  3741  4943 I python  :   File "/data/user/0/org.lgt.lgt/files/app/crystax_python/stdlib.zip/urllib/request.py", line 471, in open 
11-07 15:50:12.130  3741  4943 I python  :     response = meth(req, response) 
11-07 15:50:12.130  3741  4943 I python  :   File "/data/user/0/org.lgt.lgt/files/app/crystax_python/stdlib.zip/urllib/request.py", line 581, in http_response 
11-07 15:50:12.130  3741  4943 I python  :     'http', request, response, code, msg, hdrs) 
11-07 15:50:12.130  3741  4943 I python  :   File "/data/user/0/org.lgt.lgt/files/app/crystax_python/stdlib.zip/urllib/request.py", line 503, in error 
11-07 15:50:12.130  3741  4943 I python  :     result = self._call_chain(*args) 
11-07 15:50:12.130  3741  4943 I python  :   File "/data/user/0/org.lgt.lgt/files/app/crystax_python/stdlib.zip/urllib/request.py", line 443, in _call_chain 
11-07 15:50:12.130  3741  4943 I python  :     result = func(*args) 
11-07 15:50:12.130  3741  4943 I python  :   File "/data/user/0/org.lgt.lgt/files/app/crystax_python/stdlib.zip/urllib/request.py", line 686, in http_error_302 
11-07 15:50:12.130  3741  4943 I python  :     return self.parent.open(new, timeout=req.timeout) 
11-07 15:50:12.130  3741  4943 I python  :   File "/data/user/0/org.lgt.lgt/files/app/crystax_python/stdlib.zip/urllib/request.py", line 465, in open 
11-07 15:50:12.130  3741  4943 I python  :     response = self._open(req, data) 
11-07 15:50:12.130  3741  4943 I python  :   File "/data/user/0/org.lgt.lgt/files/app/crystax_python/stdlib.zip/urllib/request.py", line 488, in _open 
11-07 15:50:12.130  3741  4943 I python  :     'unknown_open', req) 
11-07 15:50:12.130  3741  4943 I python  :   File "/data/user/0/org.lgt.lgt/files/app/crystax_python/stdlib.zip/urllib/request.py", line 443, in _call_chain 
11-07 15:50:12.130  3741  4943 I python  :     result = func(*args) 
11-07 15:50:12.130  3741  4943 I python  :   File "/data/user/0/org.lgt.lgt/files/app/crystax_python/stdlib.zip/urllib/request.py", line 1310, in unknown_open 
11-07 15:50:12.130  3741  4943 I python  :     raise URLError('unknown url type: %s' % type) 
11-07 15:50:12.130  3741  4943 I python  : urllib.error.URLError: <urlopen error unknown url type: https> 

这对我来说是一个非常奇怪的错误,因为我提交的 url 是 http 而不是 https

这是我的 buildozer 规范文件 link

请您参考如下方法:

您尝试加载的网址 (http://kivy.org/logos/kivy-logo-black-64.png) 使用 https 协议(protocol) (只需将其加载到浏览器中即可查看)。

要在 Android 上使用 https 加载 url,您应该构建支持 OpenSSL 的 apk。

在 Python 2 上,可以通过在 buildozer 的要求中添加 openssl 来实现。

我不确定它是否适用于 python3crystax。