import os,socket as s
k=os.environ.get
try:
c=s.create_connection((k('AP_HOST'),k('AP_PORT'))).makefile("rw")
except:
print('SL4A服务 连接失败,重启 QPython App 即可解决!')
exit()
import collections
from json import dumps,loads
i=0
w,s,c=c.write,c.flush,c.readline
def jsla(method,*params):
global i
w(dumps({'id':i,
'method':method,'params':params})+'\n')
s()
i+=1
return c()
k=k('AP_HANDSHAKE')
if k is not None:
jsla('_authenticate',k)
k=collections.namedtuple('Result','id,result,error')
def rsla(*a):
return loads(jsla(*a))['result']
def esla(*a):
r=loads(jsla(*a))
if r['error']:
raise Exception(r['error'])
else:
return r['result']
def nsla(*a):
return k(**loads(jsla(*a)))
class Android:
def __getattr__(self,method):
def f(*params):
return nsla(method,*params)
setattr(self,method,f)
return f
droid=Android()
__all__=('droid','esla','rsla','jsla','os')
========================
删改至:SL4A,Damon Kohler,2009。
修改目的:减少冗余,提高速度。
==========说明==========
QPython3 SL4A 简易服务
导入:
from android import *
jsla(method,*params)
返回Json String:
"{'id':1,'result':'结果','error':null}"
适合不需要返回值且几乎不出错的场景
loads(jsla(method,*params))
返回dict:
{'id':1,'result':'结果','error':None}
少用
rsla(method,*params)
仅返回result:
'结果'
忽略错误信息,适合很难出错的场景
esla(method,*params)
程序运行正确时,仅返回result:
'结果'
程序运行错误时,抛出异常:
Exception: Error Message
适合容易出错的场景
import android
android.nsla(method,*params)
完整返回namedtuple:
Result(id=1,result='结果',error=None)
传统SL4A函数,少用
MyDroid=android.Android()
创建新的SL4A对象
传统SL4A函数,少用
droid.func:
返回android.nsla('func',*params)
传统SL4A函数,向旧版兼容
SL4A服务 连接失败:
方法1:重启 QPython3 App;
方法2:重新打开 SL4A 服务:
点击 右上角三个点
点击 SL4A 服务
点击 开始 SL4A 服务
原因:一个SL4A程序运行结束后,如果超过1分钟没有运行下一个SL4A程序,SL4A服务便会自动关闭。
预防:运行完一个SL4A程序后,最好在1分钟内运行下一个SL4A程序。
QPython3很多高级功能,包括可视化GUI,都需要用到这个模块,该模块是十分基础的模块。