我一直在尝试使用 pydroid 和 Tasker 组合一个应用程序来识别我手机上的图像。
我用Tasker每5秒截图一次,保存然后显示最近的结果。
在 Pydroid 中,我打开屏幕截图,对其进行分析并将结果写入文本文件,然后由 Tasker 访问该文件。
有时,当文件被其中一个应用程序打开而另一个应用程序试图访问它时,我的手机就会崩溃并重新启动。
我的问题是,如果其他应用程序正在使用该文件,我如何在 pydroid(或 tasker)中检测到该文件可以安全访问?
这是我的 Tasker 任务:
%Enabled
由其他任务控制
A1: Flash [
Text: Enabled
Continue Task Immediately: On
Dismiss On Click: On ]
A2: Variable Set [
Name: %Enabled
To: True
Max Rounding Digits: 3
Structure Output (JSON, etc): On ]
A3: Take Screenshot [
File: /storage/47BE-16F5/folder/screenshot.png ]
A4: Read File [
File: /storage/47BE-16F5/folder/text.txt
To Var: %text
Structure Output (JSON, etc): On ]
A5: Flash [
Text: %text
Continue Task Immediately: On
Dismiss On Click: On ]
A6: Wait [
MS: 0
Seconds: 5
Minutes: 0
Hours: 0
Days: 0 ]
A7: Goto [
Type: Action Number
Number: 3 ]
If [ %Enabled eq True ]
这里是相关的python代码:
from PIL import Image
screenshot = Image.open("/storage/47BE-16F5/folder/screenshot.png")
...
with open(TEXT_DIR, 'w', encoding="utf-8") as f:
f.write(results)
我试图将 python 代码包装在一个 try-except 循环中,但我不知道异常到底是什么,因为每次打印错误消息之前手机都会崩溃。
另外,把相关的python代码换成常量后,手机就完全不死机了,肯定是文件访问问题。
在 Tasker 中对修改文件的检测效果不佳,一段时间后它不再起作用,可能是因为系统挂起或对检测文件的读/写权限
更好且缺陷更少的解决方案可能是使用“am”命令向任务执行者发送广播/服务以执行某些任务
但是Pydroid没有这个功能
所以我找到的另一种选择是为 Tasker 创建一个 api,发送请求并获取返回的数据
FastAPI 的示例:
import uvicorn
from fastapi import FastAPI
app = FastAPI()
@app.get('/event')
def event(number: int):
result = {
'number': number
}
return result
if __name__ == '__main__':
uvicorn.run(app)
以及 Tasker 中与应用程序通信的操作
Task: HOME - .Test
<Test>
A1: Anchor
A2: Variable Set [
Name: %value
To: 50
Max Rounding Digits: 3
Structure Output (JSON, etc): On ]
A3: HTTP Request [
Method: GET
URL: http://localhost:8000/event
Query Parameters: number:%value
Timeout (Seconds): 30
Structure Output (JSON, etc): On ]
A4: Text/Image Dialog [
Title: Result
Text: Number: %http_data.number
Close After (Seconds): 30 ]
虽然它工作正常,但似乎在一段时间后 Pydroid 被系统禁用并且 API 被关闭,但想象一下这可以通过弄乱电池和暂停设置来解决