通过Kivy访问Android摄像头

j5fpnvbx  于 2022-12-21  发布在  Android
关注(0)|答案(6)|浏览(610)

请我正在寻找一个工作周围获得访问Android相机通过kivy,或一个库,我可以集成与kivy为了访问相机。
我正在为Android开发一个应用程序,但使用python-kivy作为UI,
任何事情都会被感激
非常感谢。

kh212irz

kh212irz1#

这是我的示例代码,可以在Android上运行。只需导入https://github.com/kivy/plyer/blob/master/plyer/platforms/android/camera.py文件。另外,不要忘记添加CAMERA权限到manifest。
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()
h43kikqp

h43kikqp2#

Kivy有一些调用camera的本地支持,请查看核心提供者的新编程指南或uix小部件的新编程指南,理论上,核心应该能够适应不同平台,小部件应该能够使用camera。

8fsztsew

8fsztsew3#

这链接到一个讨论,在那里可以找到一个自定义的实现。它是基于PyJNius的自动 Package 的android API的相机类。没有尝试我自己,但你可以给予它一个尝试...

pkln4tw6

pkln4tw64#

感谢这篇文章,我能够解决我的应用程序中的一个关键问题,非常感谢,伙计们,这是我使用的代码,我希望你们能在某个地方使用它。
我做了一个屏幕,用了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()
bksxznpy

bksxznpy5#

由于我很难找到如何在android上使用相机的答案,我想我会分享我的答案之旅,以保存下一个人的时间。
我找不到直接从Kivy那里学习工作相机的方法:
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在最顶端的小部件。尽管如此,上面的文字仍然可能是有帮助的

4si2a6ki

4si2a6ki6#

几年后,Android API在如何处理权限和存储提供程序方面发生了变化。
我通过Kivy here为Android相机提供了一个完整的工作示例,它基本上需要对python-for-android中已编译的清单文件进行一些调整,以及直接使用FileProvider

相关问题