请帮我找到一种方法,通过kivy访问Android相机,或者一种可以与kivy集成的库以便访问相机。 我正在为Android开发应用程序,但是使用python-kivy来处理UI。
非常感谢任何帮助。
非常感谢任何帮助。
__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()
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上使用相机的答案,所以我想分享我的经历,以节省下一个人的时间。
我找不到直接从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
。尽管如此,上面的文本仍然可能有所帮助。
几年后,Android API 在处理权限和存储提供程序方面发生了变化。
我有一个完整的 Android 相机工作示例,通过 Kivy 这里。它基本上需要对 python-for-android
编译清单文件进行一些调整,并直接使用 FileProvider
进行操作。