这是一篇发表在kivyspacegame上的文章,讲的是如何使用python在你的安卓设备上访问传感器。这篇教程是为这些用kivy开发python移动apps而写的。Kivy运行速度非常快,并且很容易使用。访问博客以获取更多的关于用Kivy开发游戏的教程。也可以看看google play store上的Helios: Mining Adventure游戏程序。
这篇教程将关注plyer,一个可以读取传感器,发送email,以及将文本转成语音,显示通知等等功能的库。如果你正在用python开发移动运用程序,访问传感器将会是一项很复杂的工作。Plyer大大的将工作简单化。
这篇教程涵盖了安装plyer,构建使用plyer的android包,并且举了一些显示通知,使手机振动,让android设备对你说话的小例子。
(运行在手机上的运用截图)
I. 背景
Android包含访问传感器的内置API.通过python访问Java类比较复杂,这个过程通过pyjnius得以简化。Pyjnius需要一些额外的跑腿的工作以处理一些特性。对于苹果设备来说,用的是pyobjus。Plyer被创造出来是为了简化访问手机传感器的,并且使用的是与平台无关的pythonic的方法。同样的plyer代码可以运行在Windows/Linux/iOS/android。
II. 安装Plyer
在终端下运行下面的命令:
sudo pip install git+https://github.com/kivy/plyer.git@master
有一个消息会通知你plyer已经安装成功了。你也要确保带有plyer的python-for-android已经安装成功。要不然,当你在你的手机上运行你的代码时,程序将会因你的软件包里没有plyer库而崩溃。
III. 和plyer一起打包
除非你已经在python-for-android中包含了plyer,否则你的软件包里将不会包含plyer,为了解决这个问题,需要将plyer添加到python-for-android:
定位到你的python-for-android目录,例如:
cd /home/kivy/android/python-for-android dist/
运行带正确参数的distribute.sh 以包含plyer,以及其它你需要的东东:
./distribute.sh -m plyer pyjnius jpeg png kivy
IV. 代码:
首先,导入关键的模块:
import kivy
kivy.require('1.8.0')
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.label import Label
from kivy.core.window import Window
from plyer import notification, vibrator, tts, email, accelerometer
from kivy.clock import Clock
其次,设置图形:
#setup graphics
from kivy.config import Config
Config.set('graphics','resizable',0)
#Graphics fix
from kivy.core.window import Window;
Window.clearcolor = (0,0,0,1.)
对于这个例子,将有一个主类用于与android api连接。它包含了一些函数以实现这个过程。
class GUI(Widget):
#this is the main widget that contains the game
def __init__(self, **kwargs):
super(GUI, self).__init__(**kwargs)
#add a label to advertise the blog
l = Label(text='kivyspacegame.wordpress.com')
l.x = Window.width/2 - l.width/2
l.y = Window.height/2
self.add_widget(l)
#setup accelerometer
try:
#we've already imported the accelerometer from plyer
#it's very easy to access
accelerometer.enable()
except:
#when you run the code on linux, expect this to happen
l.text = 'cant enable acceleromteer'
#setup acceleromter labels
#We create a label to display accelerometer output
self.label = Label(text = 'accelerometer:')
self.label.y = Window.height*0.25
self.label.x = Window.width*0.5
self.add_widget(self.label)
#setup timer to update accelerometer
#we want to regularly read the accelerometer
Clock.schedule_interval(self.check_accel, 1.0/60.0)
#these four functions use other plyer features to talk to the android api
self.notify()
self.vibrate()
self.talk()
self.email()
def check_accel(self,dt):
#update label
try:
self.txt = str(round(accelerometer.acceleration[0],4)) +','
+ str(round(accelerometer.acceleration[1],4)) + ','
+ str(round(accelerometer.acceleration[2],4))
self.label.text='accelerometer: ' + self.txt
except:
#expect this on linux
self.label.text = ' cant read accelerometer'
def notify(self):
try:
#this notification will pop up on ubuntu as well!'
notification.notify(title="Kivy Notification",message="Plyer Up and Running!",
app_name="kivy_test",app_icon="icon.png",timeout=10)
except:
print 'error notifiying'
def vibrate(self):
try:
#the vibrator will only work on a vibrating device (ie android)
vibrator.vibrate(time=3)
except:
print 'error vibrating'
def talk(self):
try:
tts.speak(message='Resistance is FUTILE. Select an e-mail app.')
except:
print 'cant talk'
def email(self):
try:
email.send(recipient = '[email protected]',subject =
'Thanks!', text ='Enjoyed your lesson')
except:
print 'cant email'
最后的代码:
class ClientApp(App):
def build(self):
#this is where the root widget goes
#should be a canvas
app = GUI()
return app
if __name__ == '__main__' :
ClientApp().run()
V. 将应用程序打包
当你的代码已经准备好,并且在linux上运行没问题之后,进入你的发布目录打包运用程序:
cd /home/kivy/android/python-for-android/dist/default
再输入下面的命令,请根据实际情况调整目录。小心不要将不必要的空间给包含进去。这个命令将会在打包成功后将运用程序安装到你的手机上:
./build.py –dir /home/kivy/code/TeachToCode/GuestLessonSensors/ –name “PlyerTest” –package com.molecularflowgames.PlyerTest –version 1.0 –icon /home/kivy/code/TeachToCode/GuestLessonSensors/icon.png –orientation landscape –permission VIBRATE debug installd
这是一个可以在你的运用程序中使用的图标
原文链接:http://bytedebugger.wordpress.com/2014/07/06/guest-post-accessing-android-sensors-with-kivy-via-plyer/