Как повесить событие на тряску телефона используя Python?

Делаю приложение на Kivy, тут у меня возник вопрос. Можно ли как то повесить событие на тряску телефона? Т.е выполнить какую-нибудь функцию при тряске телефона пользователем. На чем можно такое реализовать используя python?


Ответы (2 шт):

Автор решения: Kram

Это супер сложно, но реализуемо:

Добавьте в файл buildozer.spec строку с java зависимостями rxjava и rxandroid:

android.gradle_dependencies =

дальше нужно изменить build.gradle таким образом:

android {
  ...
  defaultConfig {
    ...
    jackOptions {
      enabled true
    }
  }
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

Потом берём код из этой статьи: https://habr.com/ru/company/badoo/blog/304488/

Чуть-чуть корректируем и вставляем в отдельный файл.

Далее опять меняем buildozer.spec и добавляем наш файл java файл:

android.add_jars = java.jar

Потом используя библиотеку pyjnius

Мы вызываем методы этого файла и ловим ивент тряски.

Если у вас получится это сделать выложите репо на гитхаб.

→ Ссылка
Автор решения: Dmitry

С библиотекой plyer это реализовать довольно легко. Kivy Plyer

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label

from plyer import gyroscope, vibrator

from kivy.clock import Clock

class MyBox(BoxLayout):    
    def __init__(self, **kwargs):
        super().__init__(orientation="vertical", padding=10, spacing=10, **kwargs)       
        self.label = Label(text = '0', font_size = '30sp')
        self.add_widget(self.label)
        gyroscope.enable()
        Clock.schedule_interval(self.run_acceleration, 0.1)
        
     
    def run_acceleration(self, *args):
        print(gyroscope.rotation)
        try:
            if (gyroscope.rotation[0] >0.5 or
                gyroscope.rotation[0] < -0.5 or
                gyroscope.rotation[1] > 0.5 or
                gyroscope.rotation[1] < -0.5 or
                gyroscope.rotation[2] > 0.5 or
                gyroscope.rotation[2] < -0.5):
                iter = int(self.label.text)
                self.label.text = str(iter + 1)
                vibrator.vibrate(0.05)
        except:
            pass
    

class MyApp(App):
    def build(self):
        return MyBox()


app = MyApp()
app.run()
→ Ссылка