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

使用Pyjnius调用Android振动功能遇参数不匹配及崩溃问题求助

我之前在做Kivy Android应用时也碰到过一模一样的振动问题,你的错误其实是两个原因叠加导致的:Android版本迭代带来的API变化,加上Jnius对Java方法重载的匹配规则。让我帮你一步步解决:

问题根源拆解

第一个错误 jnius.jnius.JavaException: Invalid call, number of argument mismatch, got 1 need 4:
这是因为在Android API 26及以上版本中,Vibrator.vibrate(long) 这个旧方法已经被标记为过时,Jnius在查找可用方法时,优先匹配了其他需要多参数的重载版本,但你只传了1个参数,所以触发参数不匹配错误。

第二个崩溃问题:
你尝试传入4个参数调用了错误的方法重载,直接导致JNI层面出现异常崩溃。

完整解决方案

要解决这个问题,需要两步走:配置权限 + 适配不同Android版本的API调用。

1. 添加振动权限

首先在你的buildozer.spec文件中添加振动权限,没有权限的话即使代码正确也无法触发振动:

android.permissions = VIBRATE

2. 适配版本的振动代码

下面是可直接运行的代码,会自动判断设备的Android版本,调用对应的API:

from jnius import autoclass
from android import api_version

PythonActivity = autoclass('org.kivy.android.PythonActivity')
Context = autoclass('android.content.Context')
activity = PythonActivity.mActivity
vibrator = activity.getSystemService(Context.VIBRATOR_SERVICE)

def trigger_vibration(milliseconds=1000):
    if not vibrator:
        print("Vibrator service is not available on this device")
        return
    
    # 适配Android API 26及以上版本
    if api_version >= 26:
        VibrationEffect = autoclass('android.os.VibrationEffect')
        # 创建单次振动效果,DEFAULT_AMPLITUDE表示使用设备默认振动强度
        effect = VibrationEffect.createOneShot(milliseconds, VibrationEffect.DEFAULT_AMPLITUDE)
        vibrator.vibrate(effect)
    else:
        # 旧版本直接调用传统方法
        vibrator.vibrate(milliseconds)

# 测试调用:振动1秒
trigger_vibration(1000)

代码细节说明

  • 版本判断:用android.api_version获取当前设备的Android API版本,完美区分新旧API的调用逻辑。
  • API 26+的振动效果:除了单次振动,你还可以创建自定义振动模式(比如振动-暂停-循环),示例如下:
    # 振动500ms → 暂停200ms → 振动500ms,-1表示不重复循环
    timings = [500, 200, 500]
    effect = VibrationEffect.createWaveform(timings, -1)
    vibrator.vibrate(effect)
    
  • Buildozer配置优化:如果要适配更高版本的Android,建议在buildozer.spec中设置对应API级别:
    android.api = 33
    

内容的提问来源于stack exchange,提问作者Nitan Alexandru Marcel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:37:29