通过Kivy访问安卓相机

15
请帮我找到一种方法,通过kivy访问Android相机,或者一种可以与kivy集成的库以便访问相机。 我正在为Android开发应用程序,但是使用python-kivy来处理UI。
非常感谢任何帮助。
6个回答

6
这是我的样例代码,适用于Android。只需导入该文件https://github.com/kivy/plyer/blob/master/plyer/platforms/android/camera.py。 同时,不要忘记在清单中添加相机权限。
main.py:
__version__ = '1.0'

import kivy

# importing file from https://github.com/kivy/plyer/blob/master/plyer/platforms/android/camera.py
# I downloaded it and saved it in the same directory:
from camera import AndroidCamera

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty, StringProperty

import base64

class MyCamera(AndroidCamera):
    pass

class BoxLayoutW(BoxLayout):
    my_camera = ObjectProperty(None)
    # /sdcard means internal mobile storage for that case:
    image_path = StringProperty('/sdcard/my_test_photo.png')

    def __init__(self, **kwargs):

        super(BoxLayoutW, self).__init__()

        self.my_camera = MyCamera()

    def take_shot(self):
        self.my_camera._take_picture(self.on_success_shot, self.image_path)

    def on_success_shot(self, loaded_image_path):
        # converting saved image to a base64 string:
        image_str = self.image_convert_base64
        return True

    #converting image to a base64, if you want to send it, for example, via POST:
    def image_convert_base64(self):
        with open(self.image_path, "rb") as image_file:
            encoded_string = base64.b64encode(image_file.read())
        if not encoded_string:
            encoded_string = ''
        return encoded_string

if __name__ == '__main__':

    class CameraApp(App):
        def build(self):
            main_window = BoxLayoutW()
            return main_window

    CameraApp().run()

camera.kv:

<BoxLayoutW>:

    Button:
        text: 'shot'
        on_release: root.take_shot()

@Suzana_K & megastruktur:我已经使用了这段代码,它可以将照片保存到/sdcard(它启动了Android的本地相机界面),但是在拍摄后,应用程序会直接关闭/不返回到应用程序屏幕以便使用照片。目前我只是使用Kivy Launcher。你能帮忙解决这个问题吗? - simplynail

3
Kivy对于调用相机有一定的本地支持。请查看新编程指南中此页面获取核心提供程序或此页面获取UIX小部件。理论上,核心应该能够适应不同平台,并且小部件应该能够使用相机。

6
Kivy相机与安卓相机不兼容。我在安卓设备上尝试启动相机很多次,但总是失败,但在桌面环境中表现完美。 - Plaix

1
感谢这篇文章,我能够解决我的应用程序中的一个关键问题,非常感谢大家。以下是我使用的代码,希望你们也能在某个地方使用它。
我制作了一个屏幕,并使用了plyer相机功能。
from os import getcwd
from os.path import exists
from os.path import splitext

import kivy
kivy.require('1.8.0')

from kivy.app import App
from kivy.properties import ObjectProperty
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.popup import Popup
from kivy.logger import Logger

from plyer import camera

我还在屏幕、标签、弹出窗口等方面使用了其他导入,你可以根据需要仔细研究它们。

class ScreenFive(Screen): #camera screen


def gg1back(self):
    self.parent.current = 'First'

def do_capture(self):

    filepath = 'IMG_1.jpg'
    ext = splitext(filepath)[-1].lower()

    try:
        camera.take_picture(self.camera_callback,filepath)
    except NotImplementedError:
        popup = MsgPopup(
            "The Face_rec_image feature has not yet \n been implemented for this platform :(")
        popup.open()

def camera_callback(self, filepath):
    if(exists(filepath)):
        popup = MsgPopup("Picture saved!")
        popup.open()
    else:
        popup = MsgPopup("Could not save your picture!")
        popup.open()

1

这个链接指向一个讨论,其中可以找到自定义实现。它基于PyJNIus自动包装android API的Camera类。我自己没有尝试过,但你可以试试……


0

由于我很难找到如何在Android上使用相机的答案,所以我想分享我的经历,以节省下一个人的时间。

我找不到直接从Kivy使相机类工作的方法:

https://kivy.org/docs/examples/gen__camera__main__py.html

最终我找到了上面发布的解决方案,花费了一些时间在我的应用程序中实现它,结果发现在拍照后无法返回应用程序 - 应用程序被终止,所以我无法回到应用程序中使用图片(我正在使用Kivy Launcher)。 最近我发现访问相机的这种方式已经被放弃了(https://github.com/kivy/plyer/issues/16#issuecomment-54094174
但是我找到了下面的解决方案,只需运行示例代码,看起来我将能够获得我想要的结果(只需要稍微调整一下,避免在取消安卓相机或未拍摄照片时崩溃)。

https://github.com/kivy/kivy/tree/master/examples/android/takepicture

编辑: 看起来我的应用程序被终止了,因为我没有在最上层的小部件中实现on_pause: return True。尽管如此,上面的文本仍然可能有所帮助。


0

几年后,Android API 在处理权限和存储提供程序方面发生了变化。

我有一个完整的 Android 相机工作示例,通过 Kivy 这里。它基本上需要对 python-for-android 编译清单文件进行一些调整,并直接使用 FileProvider 进行操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接