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

Thread类中调用振动服务报错:类型不匹配(String/Context)

解决Thread类中调用Vibrator服务的类型不匹配错误

你遇到的错误核心原因是:getSystemService()是Context类的专属成员方法,你的myThread继承自Thread,并非Context的子类,直接调用该方法时,系统会误将你传入的Context.VIBRATOR_SERVICE(字符串类型)判定为需要的Context对象,因此抛出类型不匹配异常。而MainActivity本身是Context的子类(Activity继承自Context),所以在Activity中可以直接调用该方法。

修复步骤

  1. 给Thread类传入Context实例
    在Thread的构造函数中添加Context参数,通过这个Context来获取Vibrator服务。推荐使用applicationContext,避免Activity销毁时引发内存泄漏。

  2. 处理API版本兼容
    Android 8.0(API 26)及以上,vibrate(long)方法已过时,需要使用VibrationEffect来实现振动。

修复后的完整代码:

import android.content.Context
import android.os.Build
import android.os.VibrationEffect
import android.os.Vibrator

class MyThread(private val context: Context) : Thread() {
    override fun run() {
        val vibrator = context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
        
        for (i in 1..5) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                // API 26+ 使用VibrationEffect
                val vibrationEffect = VibrationEffect.createOneShot(100, VibrationEffect.DEFAULT_AMPLITUDE)
                vibrator.vibrate(vibrationEffect)
            } else {
                // 兼容低版本
                @Suppress("DEPRECATION")
                vibrator.vibrate(100)
            }
            Thread.sleep(1000)
        }
    }
}

使用示例(在Activity中启动线程)

// 在MainActivity内调用
val vibrationThread = MyThread(applicationContext)
vibrationThread.start()

必要权限

别忘了在AndroidManifest.xml中添加振动权限:

<uses-permission android:name="android.permission.VIBRATE" />

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 11:57:11