kivyを介してAndroidカメラにアクセスするための回避策、またはカメラにアクセスするためにkivyと統合できるライブラリを探しています。
私はAndroid用のアプリケーションを開発していますが、UIにpython-kivyを使用しています。
何でも本当にありがたいです、
どうもありがとう。
これが私のサンプルコードで、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()
Kivyには、カメラの呼び出しをネイティブでサポートしています。コアプロバイダーの新しいプログラミングガイドのこのページ、またはuixウィジェットの新しいプログラミングガイドのこのページを確認してください。理論的には、コアはプラットフォーム間で適応できる必要があり、ウィジェットはカメラを使用できる必要があります。
これは、カスタム実装を見つけることができる議論にリンクしています。これは、AndroidAPIのCameraクラスのPyJNIusの自動ラッピングに基づいています。自分で試してみませんでしたが、試してみることができます...
この投稿のおかげで、私は私のアプリの重大な問題を解決することができました。ここにたくさんの人が私が使用した私のコードです。あなたたちがどこかでそれを使用できることを願っています。
スクリーンを作ってプライヤーカメラ機能を使ってみました
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()
アンドロイドでカメラを使う方法の答えを見つけるのは難しかったので、次の人の時間を節約するために答えへの私の旅を共有しようと思いました。
Kivyから直接Cameraクラスを作成する方法が見つかりませんでした:
https://kivy.org/docs/examples/gen__camera__main__py.html
ついに私は上記の解決策を見つけました、そして私のアプリにそれを実装するのに時間を無駄にした後、写真を撮った後にアプリに戻ることが不可能であることがわかりました-アプリは終了したので、私は戻ることができませんでした写真を利用するアプリ(私はKivyLauncherを使用していました)。つい最近、このカメラへのアクセス方法が廃止されたことがわかりました(https://github.com/kivy/plyer/issues/16#issuecomment-54094174)
しかし、以下の解決策を見つけました。サンプルコードを実行するだけで、希望する結果を得ることができるように見えます(Androidカメラがキャンセルされたとき/写真が撮られていないときにクラッシュしないように少し調整する必要があります)
https://github.com/kivy/kivy/tree/master/examples/android/takepicture
on_pause: return True
編集:最上位のウィジェットに実装しなかったため、アプリが終了したようです。それにもかかわらず、上記のテキストはまだ役立つかもしれません
数年後、Android APIは、権限とストレージプロバイダーの処理方法に関して変更されました。
ここにKivyを介したAndroidカメラの完全な実例があります。基本的には、でコンパイルされたマニフェストファイルを微調整するだけでpython-for-android
なく、を直接操作する必要がありますFileProvider
。