15

kivyを介してAndroidカメラにアクセスするための回避策、またはカメラにアクセスするためにkivyと統合できるライブラリを探しています。

私はAndroid用のアプリケーションを開発していますが、UIにpython-kivyを使用しています。

何でも本当にありがたいです、

どうもありがとう。

4

6 に答える 6

6

これが私のサンプルコードで、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()
于 2014-03-14T16:01:45.897 に答える
2

Kivyには、カメラの呼び出しをネイティブでサポートしています。コアプロバイダーの新しいプログラミングガイドのこのページ、またはuixウィジェットの新しいプログラミングガイドのこのページを確認してください。理論的には、コアはプラットフォーム間で適応できる必要があり、ウィジェットはカメラを使用できる必要があります。

于 2013-03-12T12:13:31.337 に答える
1

これは、カスタム実装を見つけることができる議論にリンクしています。これは、AndroidAPIのCameraクラスのPyJNIusの自動ラッピングに基づいています。自分で試してみませんでしたが、試してみることができます...

于 2013-05-12T13:45:49.223 に答える
1

この投稿のおかげで、私は私のアプリの重大な問題を解決することができました。ここにたくさんの人が私が使用した私のコードです。あなたたちがどこかでそれを使用できることを願っています。

スクリーンを作ってプライヤーカメラ機能を使ってみました

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()
于 2018-04-25T01:45:46.980 に答える
0

アンドロイドでカメラを使う方法の答えを見つけるのは難しかったので、次の人の時間を節約するために答えへの私の旅を共有しようと思いました。

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編集:最上位のウィジェットに実装しなかったため、アプリが終了したようです。それにもかかわらず、上記のテキストはまだ役立つかもしれません

于 2016-08-26T10:05:43.227 に答える
0

数年後、Android APIは、権限とストレージプロバイダーの処理方法に関して変更されました。

ここにKivyを介したAndroidカメラの完全な実例があります。基本的には、でコンパイルされたマニフェストファイルを微調整するだけでpython-for-androidなく、を直接操作する必要がありますFileProvider

于 2019-08-23T14:36:22.180 に答える