Использование частичного wakelock и сервиса не запускает приложение при заблокированном телефоне

Я использую частичную блокировку пробуждения и службу в своем приложении 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()

Я попытался использовать частичную блокировку пробуждения, чтобы сохранить работоспособность процессора телефона, пока он заблокирован. Я предполагаю, что причина, по которой телефон перестает вибрировать, когда он заблокирован, заключается в том, что процессор блокируется, когда он заблокирован, и что телефон использует процессор для вибрации. Кроме того, когда я разблокирую телефон и снова открываю приложение, переключатель остается в том же положении, что и когда я его покинул, так как я вставил в код определение on_pause, но телефон больше не вибрирует. Это наводит меня на мысль, что по какой-то причине код не получает частичную блокировку, и процессор отключается, когда телефон заблокирован. Этот main.py и service/main.py способны успешно сообщать положение коммутатора. Однако, когда этот main.py получает сообщение, wakelock.acquire(), похоже, не сохраняет процессор телефона включенным.

Требуется ли в телефоне процессор, чтобы он продолжал вибрировать при блокировке? Если так, то есть ли другой способ оставить процессор включенным и телефон вибрирует после того, как я его заблокирую? Я правильно использую jnius и wakelock.acquire/release?

Если телефону не требуется, чтобы ЦП продолжал вибрировать, когда он заблокирован, то что еще заставляет телефон перестать вибрировать, когда он заблокирован, и что мне нужно для того, чтобы телефон вибрировал после его блокировки?

Спасибо за помощь.

1 ответ

Убедитесь, что у вас установлены разрешения WAKE_LOCK в buildozer.spec:

# (list) Permissions
android.permissions = WAKE_LOCK
Другие вопросы по тегам