1. 知识学习

第一段代码:
怎么在Android下用python调用摄像头?python吧百度贴吧

#encoding:utf-8
import androidhelper,sys

droid = androidhelper.Android()
p = "776779.jpg"
try:
    droid.cameraCapturePicture("776779.jpg",True)
except:
    print '拍照失败'
sys.exit(1)
print '拍照完成'

关于Androidhelper的文档:androidhelper documentation

2. 试行

方法cameraCapturePicture

self,targetPath,useAutoFocus=True

cameraCapturePicture(targetPath,useAutoFocus=True)

Take a picture and save it to the specified path.
targetPath (String) useAutoFocus (Boolean) (default=true) returns: (Bundle)
A map of Booleans autoFocus and takePicture where True indicates success.

第一个参数是路径,代码写成:

import androidhelper
@app.route('/camera.html', method='GET')
def camerababy():
    droid = androidhelper.Android()
    droid.cameraCapturePicture(ROOT+'/photo/776779.jpg',True)
    return template(ROOT+'/camera.html')

运行成功,可以在项目根目录下建立一个photo文件夹,并拍照。
缺点是照片自动拍成,无法调整拍摄角度和控制拍摄内容。

方法cameraInteractiveCapturePicture

self,targetPath
cameraInteractiveCapturePicture(targetPath) Starts the image capture application to take a picture and saves it to the specified path. targetPath (String)

代码改成:

import androidhelper
@app.route('/camera.html', method='GET')
def camerababy():
    droid = androidhelper.Android()
    droid.cameraInteractiveCapturePicture(ROOT+'/photo/776779.jpg')
    return template(ROOT+'/camera.html')  

马上就可以自己控制镜头方向,拍摄自己想要的照片了。位置仍然在photo下。

下一个问题是:由于照片名称固定,所以每次新拍摄的,都会将原先拍的替代掉。

大概由于qpython不稳定,写动态的照片文件名,调试了很久,终于运行成功。
代码:

@app.route('/camera.html', method='GET')
def camerababy():
    droid = androidhelper.Android()
    if not exists(ROOT+'/photo'):
        photoid = 1 
    else:
        photoid = sum([len(files) for root,dirs,files in os.walk(ROOT+'/photo')]) + 1
    # 设置照片名
    photoname = str('babyrecordphoto%d.jpg' % photoid)
    nowtime = time.strftime("%d/%m/%Y %H:%M:%S")
    # 拍照
    droid.cameraInteractiveCapturePicture(ROOT+'/photo/%s' % photoname)
    return template(ROOT+'/camera.html', photoid=photoid, nowtime=nowtime, photoname=photoname)

顺便解决了数文件的任务。
文档见:15.1. os — Miscellaneous operating system interfaces — Python 2.7.11 documentation

理想状态是像历史记录一样,返回网页时,能列出照片名列表和时间。但不知何故,db文件无法打开。昨天也遇到这个问题,后来又消失了。

增加db模块后:

@app.route('/camera.html', method='GET')
def camerababy():
    droid = androidhelper.Android()
    if not exists(ROOT+'/photo'):
        photoid = 1 
    else:
        photoid = sum([len(files) for root,dirs,files in os.walk(ROOT+'/photo')]) + 1
    # 设置并保存照片名
    nowtime = time.strftime("%d/%m/%Y %H:%M:%S")    
    photoname = str('babyrecordphoto%d.jpg' % photoid)
    data = nowtime, photoname
    savephotoname(data)
    # 读取照片名
    namelist = readphotoname()  
    # 拍照
    droid.cameraInteractiveCapturePicture(ROOT+'/photo/%s' % photoname)
    return template(ROOT+'/camera.html', photoid=photoid, photoname=namelist)  

有photo文件夹的情况下,运行成功。

删去已有的photo文件夹和photoname.db文件,再运行,非常慢,返回camera页面,内容正确。到根目录文件夹查看,photoname.db文件已经成功建立,而photo文件夹未建立。因此新拍的照片不存在。

使用动态照片名之前,是会自动建立photo文件夹的。那就加上建立文件夹的步骤吧。

    if not exists(ROOT+'/photo'):
        photoid = 1 
        os.mkdir(ROOT+'/photo')

结果报错:

Python实现mkdir -p递归创建多级目录 | 书影博客中,提到建文件夹两种方式的区别:

Python的os模块也存在两个函数,分别为mkdir和makedirs,其中:

mkdir( path [,mode] ):创建一个目录,可以是相对或者绝对路径,mode的默认模式是0777。如果目录有多级,则创建最后一级。如果最后一级目录的上级目录有不存在的,则会抛出一个OSError。

makedirs( path [,mode] ):创建递归的目录树,可以是相对或者绝对路径,mode的默认模式是0777。如果子目录创建失败或者已经存在,会抛出一个OSError的异常,Windows上Error 183即为目录已经存在的异常错误。如果path只有一级,与mkdir相同。

两种函数,无论哪种,都是error16错误。

去掉root,就可以运行了:

    if not exists(ROOT+'/photo'):
        photoid = 1 
        os.mkdir('/photo')  

误,还是要改成makedirs:

if not exists(ROOT+'/photo'):
        photoid = 1 
        os.makedirs(ROOT+'/photo')