通过Kivy访问Android相机

时间:2013-02-16 12:02:43

标签: android kivy

我正在寻找可以通过kivy 访问 Android相机,或者我可以与kivy 集成以便访问相机的库。< / p>

我正在为Android开发一个应用程序但是使用 python-kivy 作为用户界面,

任何事情都会非常感激,

非常感谢。

6 个答案:

答案 0 :(得分:5)

这是我的示例代码,适用于Android。只需导入该文件https://github.com/kivy/plyer/blob/master/plyer/platforms/android/camera.py 另外,不要忘记为清单添加CAMERA权限。

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()

答案 1 :(得分:3)

Kivy有一些本机支持呼叫相机。查看核心提供程序this page from the new programming guide或uix小部件this page from the new programming guide。理论上,核心应该能够在平台之间进行调整,然后小部件应该能够使用相机。

答案 2 :(得分:1)

This链接到可以找到自定义实现的讨论。它基于PyJNIus自动包装android API的Camera类。 没试过自己,但你可以尝试一下......

答案 3 :(得分:1)

感谢这篇文章,我能够解决我的应用程序中的一个关键问题,感谢很多人在这里是我使用的代码我希望你们可以在某个地方使用它。

我制作了一个屏幕并使用了plyer相机功能

Sub Main()

我还使用了一些其他进口屏幕以及标签和弹出窗口等,您可以根据自己的要求明确查看

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

答案 4 :(得分:0)

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

我无法直接从Kivy找到工作Camera类的方法:

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

最后我找到了上面发布的解决方案,在浪费了一些时间在我的应用程序中实现后,结果发现我不可能在拍完照片后返回应用程序 - 应用程序已终止,所以我无法“回到应用程序来使用图片(我使用的是Kivy Launcher)。 就在最近,我发现这种访问相机的方式被放弃了(https://github.com/kivy/plyer/issues/16#issuecomment-54094174

但后来我找到了下面的解决方案,只是运行示例代码看起来我将能够得到我想要的结果(它只需要稍微调整就不会在Android相机被取消/没有拍照时崩溃)

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

编辑: 我的应用程序已经终止,因为我没有在最顶层的小部件中实现on_pause: return True。尽管如此,上面的文字仍然可能会有所帮助

答案 5 :(得分:0)

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

我有一个通过Kivy here为Android相机制作的完整示例。基本上,它需要对python-for-android中的已编译清单文件进行一些调整,以及直接与FileProvider一起使用。