0

画面をロックしたときに実行できるように、kivy アプリで部分的なウェイク ロックとサービスを使用しています。私のサービスでは、スイッチがオンになると 1 秒おきに電話が振動しますが、アプリはスイッチがオンになったときにのみ部分的なウェイクロックの取得を試みます。これは機能していないようですが、電話をロックすると、電話の振動が 1 秒ごとに停止します。これが私のmain.pyです。

__version__ = "1.0"

import kivy
import plyer
kivy.require('1.0.9')

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.uix.switch import Switch
from kivy.utils import platform
from kivy.clock import Clock
from kivy.properties import BooleanProperty
from kivy.lib import osc
from kivy.event import EventDispatcher
from jnius import autoclass

activityport = 3001
serviceport = 3000



class ActiveSwitch(Switch):
    pass


class VibrateButton(Button):
    def vibrate(self):
            plyer.vibrator.vibrate(3)

class Vibrate(Widget):
    activate = BooleanProperty(True)
    def on_activate(self, instance, value):
            osc.sendMsg('~/kivyinstall/sahil/reply/step3_active/service', [value, ], port=serviceport)


class ActiveApp(App):
    def build(self):
            if platform == 'android':
                    from android import AndroidService
                    service = AndroidService()
                    service.start()
                    self.service = service

            osc.init()
            oscid = osc.listen(ipAddr='127.0.0.1', port=activityport)
            osc.bind(oscid, self.message_callback, '~/kivyinstall/sahil/reply/step3_active')
            Clock.schedule_interval(lambda *x: osc.readQueue(oscid), 0)
            PythonActivity = autoclass('org.renpy.android.PythonActivity')
            activity = PythonActivity.mActivity
            Context = autoclass('android.content.Context')
            PowerManager = autoclass('android.os.PowerManager')
            power = activity.getSystemService(Context.POWER_SERVICE)
            global wakelock
            wakelock = power.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 'TAG')

            return Vibrate()

    def message_callback(self, message, *args):
            global switch
            switch = message[2]
            self.function()

    def function(self):
            if switch == 0:
                    wakelock.acquire()
            if switch == 1:
                    wakelock.release()

    def on_pause(self):
            return True

    def on_resume(self):
            pass



if __name__ == '__main__':
         ActiveApp().run()

電話がロックされている間、電話の CPU を実行し続けるために、部分的な wake lock を使用しようとしました。ロック時に電話の振動が止まる理由は、ロック時に CPU がオフになり、電話が CPU を使用して振動するためだと思います。また、電話のロックを解除してアプリを再度開くと、on_pause 定義をコードに入れているため、スイッチは離れたときと同じ位置にありますが、電話は振動しなくなりました。これは、何らかの理由で、コードが部分的な wake lock を取得しておらず、電話がロックされているときに CPU がオフになっていると思われます。この main.py と service/main.py は、スイッチの位置を正常に通信できます。ただし、この main.py がメッセージを取得すると、 wakelock.acquire() は電話の CPU をオンにしていないようです。

ロックされたときに電話を振動させ続けるには、CPU をオンにする必要がありますか? もしそうなら、ロックした後にCPUをオンにして携帯電話を振動させる別の方法はありますか? jnius と wakelock.acquire/release を正しく使用していますか?

ロック時に振動し続けるために電話が CPU を必要としない場合、ロック時に電話が振動しなくなる原因は他にあり、ロック後に電話を振動させ続けるには何が必要ですか?

ご協力ありがとうございました。

4

1 に答える 1