为何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),虽然振动权限属于普通权限无需运行时申请,但名称错误会直接导致系统判定权限未授予。
修复步骤
- 修正权限配置
打开buildozer.spec,把android.permissions行修改为:
android.permissions = WAKE_LOCK, android.permission.VIBRATE
- 清理构建缓存
修改配置后必须清理旧缓存,避免残留配置影响新构建:
buildozer android clean
- 重新构建应用
执行命令重新打包部署:
buildozer android debug deploy run
- Pydroid测试额外处理
如果是在Pydroid环境中测试,需要手动给Pydroid应用开启振动权限:进入系统设置→应用→Pydroid→权限,找到振动权限并开启,再运行代码即可。
内容的提问来源于stack exchange,提问作者Timson

