0

我在我的 kivy 应用程序中使用部分唤醒锁定和服务,以便在我锁定屏幕时它可以运行。我的服务使手机在打开开关时每隔一秒振动一次,而应用程序仅在打开开关时才尝试获取部分唤醒锁。但是,这似乎不起作用,因为当我锁定手机时,手机每隔一秒就会停止振动。这是我的 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 运行。我猜手机锁定时停止振动的原因是锁定时CPU关闭,并且手机使用CPU来振动。另外,当我解锁手机并重新打开应用程序时,开关仍然在我离开时的位置,因为我将 on_pause 定义放在代码中,但手机不再振动。这让我相信,由于某种原因,代码没有获得部分唤醒锁定,并且当手机被锁定时 CPU 会关闭。这个 main.py 和 service/main.py 能够成功地传达开关的位置。然而,当这个 main.py 收到消息时,wakelock.acquire() 似乎并没有让手机的 CPU 保持开启状态。

手机锁定时是否需要开启 CPU 才能保持振动?如果是这样,那么在我锁定它后,还有其他方法可以让 CPU 保持开启并让手机振动吗?我是否正确使用 jnius 和 wakelock.acquire/release?

如果手机在锁定时不需要CPU保持振动,那么还有什么导致手机在锁定时停止振动,我需要什么才能让手机在锁定后保持振动?

谢谢您的帮助。

4

1 回答 1

0

您是否确保在 buildozer.spec 中设置了 WAKE_LOCK 权限:

# (list) Permissions
android.permissions = WAKE_LOCK
于 2016-04-07T18:07:17.127 回答