You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Plyer的vibrate方法抛出权限异常?

问题描述

我正在开发一款应用,尝试使用Plyer提供的vibrate方法,代码和配置如下,但运行时始终提示缺少VIBRATE权限。

Python代码

class SplashScreen(MDScreen):
    def __init__(self, **kwargs):
        super(SplashScreen, self).__init__(**kwargs)
        self.main_app = MDApp.get_running_app()
        self.splash_screen_counter = 0

    def on_enter(self):
        msg = ""

        if vibrator.exists():
            msg = "Device has a vibrator!"
            vibrator.pattern(pattern=(0, 1), repeat=-1)
            vibrator.vibrate(time=2)

        # after 2 seconds, add the label
        Clock.schedule_once( partial(self.add_label_to_splash_screen, msg if msg else "Gettings things ready for you." ) , 2 )

        # increase the counter
        self.splash_screen_counter += 2

buildozer.spec相关配置

# (list) Application requirements

# comma separated e.g. requirements = sqlite3,kivy
requirements = python3,kivy,plyer

# change the major version of python used by the app
osx.python_version = 3

# Kivy version to use
osx.kivy_version = 2.2.0

#android.permissions = android.permission.INTERNET, (name=android.permission.WRITE_EXTERNAL_STORAGE;maxSdkVersion=18)
android.permissions = WAKE_LOCK, VIBRATE

# (int) Target Android API, should be as high as possible.
android.api = 31

# (int) Minimum API your APK / AAB will support.
android.minapi = 21

错误信息

File "/storage/emulated/0/bluetooth/splash_page_tutorial-7.py", line 83, in on_enter
vibrator.pattern(pattern=(0, 1), repeat=-1)
File "/data/user/0/ru.iiec.pydroid3/files/arm-linux-androideabi/lib/python3.11/site-packages/plyer/facades/vibrator.py", line 70, in pattern
self._pattern(pattern=pattern, repeat=repeat)
File "/data/user/0/ru.iiec.pydroid3/files/arm-linux-androideabi/lib/python3.11/site-packages/plyer/platforms/android/vibrator.py", line 41, in _pattern
vibrator.vibrate(
File "jnius/jnius_export_class.pxi", line 1164, in jnius.jnius.JavaMultipleMethod.call
File "jnius/jnius_export_class.pxi", line 878, in jnius.jnius.JavaMethod.call
File "jnius/jnius_export_class.pxi", line 972, in jnius.jnius.JavaMethod.call_method
File "jnius/jnius_utils.pxi", line 79, in jnius.jnius.check_exception
jnius.jnius.JavaException: JVM exception occurred: Requires VIBRATE permission java.lang.SecurityException

明明已经配置了权限,问题出在哪里?


解决办法

问题根源

你在buildozer.spec里写的VIBRATE是不完整的权限名称,Android要求权限必须使用完整标识符android.permission.VIBRATE,Buildozer无法识别简写的权限名,导致权限没有正确添加到应用清单中。

另外你目标API是31(Android 12),虽然振动权限属于普通权限无需运行时申请,但名称错误会直接导致系统判定权限未授予。

修复步骤

  1. 修正权限配置
    打开buildozer.spec,把android.permissions行修改为:
android.permissions = WAKE_LOCK, android.permission.VIBRATE
  1. 清理构建缓存
    修改配置后必须清理旧缓存,避免残留配置影响新构建:
buildozer android clean
  1. 重新构建应用
    执行命令重新打包部署:
buildozer android debug deploy run
  1. Pydroid测试额外处理
    如果是在Pydroid环境中测试,需要手动给Pydroid应用开启振动权限:进入系统设置→应用→Pydroid→权限,找到振动权限并开启,再运行代码即可。

内容的提问来源于stack exchange,提问作者Timson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 18:05:17