Доступ к камере Android через Kivy

Пожалуйста, я ищу работу, чтобы получить доступ камеры Android через kivy или библиотеку, с которой я могу интегрироваться с kivy, чтобы получить доступ к Camera.

Я разрабатываю приложение для android, но используя python-kivy для пользовательского интерфейса,

что-нибудь будет действительно оценено,

Большое спасибо.

Ответ 1

У Kivy есть встроенная поддержка для вызова камеры. Проверьте эту страницу из нового руководства по программированию для основного поставщика или эту страницу из нового руководства по программированию для виджета uix. Теоретически, ядро ​​должно быть в состоянии адаптироваться между платформами, а виджет должен иметь возможность использовать камеру.

Ответ 2

Вот мой пример кода, который работает на 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()

Ответ 3

Это указывает на дискуссию, в которой можно найти пользовательскую реализацию. Он основан на автоматической загрузке PyJNIus класса камеры Android Android. Не пробовал себя, но вы можете попробовать...

Ответ 4

Благодаря этому посту я смог решить критическую проблему в своем приложении. Большое спасибо, ребята, вот мой код, который я использовал, я надеюсь, что вы, ребята, можете его где-нибудь использовать.

Я сделал экран и использовал функцию камеры 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()

Ответ 5

Как мне было трудно найти ответ, как использовать камеру на Android-телефоне, я подумал, что поделюсь своим ответом на спасение следующего человека.

Я не мог найти способ сделать работу класса Camera прямо из Kivy:

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

Наконец, я нашел решение выше, и после того, как я потратил некоторое время на его реализацию в своем приложении, оказалось, что мне не удалось вернуться в приложение после того, как сделана фотография - приложение было прекращено, поэтому я не мог пойти обратно в приложение, чтобы использовать картинку (я использовал Kivy Launcher). Совсем недавно я узнал, что этот способ доступа к Camera был оставлен (https://github.com/kivy/plyer/issues/16#issuecomment-54094174)

Но потом я нашел решение ниже и просто запустил пример кода, он выглядит так, что я смогу получить результаты, которые я хочу (просто нужно немного настроить, чтобы не сбой, когда камера андроида отменена/фотография не была сделана )

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

EDIT: появляется мое приложение было прекращено, потому что я не реализовал on_pause: return True в верхнем виджетах. Тем не менее, текст, приведенный выше, может быть полезен

Ответ 6

Несколько лет спустя API-интерфейс Android изменился в том, как он работает с поставщиками разрешений и хранилищ.

У меня есть полный рабочий пример для камеры Android через Kivy здесь. Это в основном требует некоторой настройки скомпилированного файла манифеста в python-for-android, а также работы непосредственно с FileProvider.