Kivy A to Z -- 如何在Kivy中获取SD卡或者U盘的插拔事件
来源:互联网 发布:网络犯罪调查第二季db 编辑:程序博客网 时间:2024/06/10 01:19
Kivy只是一个图形库,在Android平台上,有很多功能需要自己扩展,其中如何监听SD卡或者U盘的插拔事件就是一个问题。但是实际上解决起来也还是比较简单。
在Android平台上,用vold来替代linux下的udev来进行热插拔设备的管理。通过local socket server把热插拔设备的事件广播给正在监听的设备,所以要在Kivy中获取U盘或者SD卡的事件,只需要通过local socket client来监听vold的发送的事件,监听的路径为/dev/socket/vold,具体的实现方式如下:
import socketimport selects = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)s.connect('/dev/socket/vold')print 'start select!'while True: ss = select.select([s,],[],[],20) data = s.recv(1024) for msg in data.split('\x00'): print msg
当接上SD卡时,会得到下面的打印:
'605 Volume sdcard /sdcard state changed from 2 (Pending) to 1 (Idle-Unmounted)'
'630 Volume sdcard /sdcard disk inserted (253:0)'
'605 Volume sdcard /sdcard state changed from 1 (Idle-Unmounted) to 3 (Checking)'
'605 Volume sdcard /sdcard state changed from 3 (Checking) to 4 (Mounted)'
当拔下SD卡时,会得到下面的打印:
'605 Volume sdcard /sdcard state changed from 4 (Mounted) to 5 (Unmounting)'
'605 Volume sdcard /sdcard state changed from 5 (Unmounting) to 1 (Idle-Unmounted)'
'631 Volume sdcard /sdcard disk removed (253:0)'
'605 Volume sdcard /sdcard state changed from 1 (Idle-Unmounted) to 0 (No-Media)'
'605 Volume sdcard /sdcard state changed from 0 (No-Media) to 2 (Pending)'
具体的代码的意义可以看system/vold/ResponseCode.h,如:
static const int VolumeDiskInserted = 630;
static const int VolumeDiskRemoved = 631;
static const int VolumeStateChange = 605;
要监听SD卡的挂载事件可以解析如下的字符串:
'605 Volume sdcard /sdcard state changed from 3 (Checking) to 4 (Mounted)'
要监听SD卡的拔出事件可以解析如下的字符串:
'605 Volume sdcard /sdcard state changed from 4 (Mounted) to 5 (Unmounting)'
具体的解析字符串的工作比较简单,可以用正则表达式来进行解析。
但是如果你直接在Kivy下执行上面的代码,会发现socket.AF_UNIX未定义,具体的原因可以看:
https://github.com/kivy/python-for-android/issues/163
目前的解决方法是直接在pyconfig.h中定义HAVE_SYS_UN_H
,然后再重新编译python。
- Kivy A to Z -- 如何在Kivy中获取SD卡或者U盘的插拔事件
- Kivy A to Z -- Kivy的运行机制
- Kivy A to Z -- Kivy模块的加载
- Kivy A to Z -- Kivy的消息处理机制
- Kivy A to Z -- Kivy的图形系统简介
- Kivy A to Z -- Kivy的UI系统简介
- Kivy A to Z -- Kivy之Properties
- Kivy a to z -- 前言
- Kivy A to Z -- Kivy 自带示例一览
- Kivy A to Z -- 如何实现焦点切换效果
- Kivy a to z -- Kivy的编译环境的搭建以及编译和运行
- Kivy a to z -- Kivy的编译过程-distribute.sh脚本分析
- Kivy A to Z -- Android apk的生成过程
- Kivy A to Z -- Python Decorator的使用
- Kivy A to Z -- 监听网络的连接状态
- Kivy A to Z -- 如何从python代码中直接访问Android的Service
- Kivy A to Z -- Kivycatalog例子无法在Android平台上运行及异常的解决方法
- Kivy A to Z -- 通过绑定进程运行CPU提高Python程序在多核CPU平台上的性能
- 黑马程序员---Java语言概述以及环境搭建
- objective-c中#import和@class的区别
- 终于考过了驾照考试,现在就=驾照下来了
- OpenCV-saturate_cast
- 图片转换为byte[]数组
- Kivy A to Z -- 如何在Kivy中获取SD卡或者U盘的插拔事件
- wifi详解(二)
- Python程序员的10个常见错误
- 网页中抓取数据
- 如何在64位的linux系统上使用汇编和C语言混合编程-32汇编移植64位系统
- LeetCode——Sum Root to Leaf Numbers
- uva 590 Always on the run(dp)
- UVa_120 - Stacks of Flapjacks
- AES - AES ECB encrypt/decrypt only decrypts the first 16 bytes