Доступ к Android-камере через Kivy
5 ответов
Kivy имеет некоторую родную поддержку для вызова камеры. Проверьте эта страница из нового руководства по программированию для основного поставщика или эта страница из нового руководства по программированию для виджета uix. Теоретически ядро должно быть способно адаптироваться между платформами, и виджет должен иметь возможность использовать камеру.
вот мой пример кода, который работает на 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()
камера.кв:
<BoxLayoutW>:
Button:
text: 'shot'
on_release: root.take_shot()
этой ссылки на диск, где можно найти пользовательскую реализацию. Он основан на автоматической упаковке PyJNIus класса камеры Android API. Я не пробовал, но ты можешь попробовать...
благодаря этому посту я смог решить критическую проблему в мое приложение Спасибо большое, ребята, вот мой код, который я использовал, я надеюсь, что вы, ребята, можете использовать его где-нибудь.
Я сделал экран и использовал функцию камеры 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()
поскольку мне было трудно найти ответ, как использовать камеру на android, я подумал, что поделюсь своим путешествием к ответу, чтобы сэкономить время следующего человека.
Я не мог найти способ сделать рабочий класс камеры прямо из киви:
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
в верхнем виджете. Тем не менее приведенный выше текст может оказаться полезным