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

Android10及以上版本ZBarScannerView扫码后触发振动失效如何解决?

问题原因

Android 10及以上版本振动不生效主要由以下几个常见原因导致:

  • 权限适配缺失:Android 12(API 31)及以上系统对振动服务的调用做了更严格的权限校验,原有仅声明VIBRATE权限的配置无法覆盖高版本要求
  • 未判断振动服务可用性:如果设备不支持振动、振动服务获取失败,调用方法会直接被系统忽略
  • 系统限制拦截:Android 10之后新增触摸振动总开关,若用户关闭该开关、开启省电模式/勿扰模式,第三方应用的主动振动请求会被系统拦截
  • 业务逻辑抢占资源:扫码成功后如果立刻执行预览重启、页面跳转等逻辑,可能导致振动请求还未被系统处理就被销毁
修复步骤
  • 第一步:补全权限声明
    若应用targetSdkVersion >= 31,需要在AndroidManifest.xml中新增适配权限:

    <!-- 原有振动权限保留 -->
    <uses-permission android:name="android.permission.VIBRATE" />
    <!-- API 31及以上新增权限,用于获取振动服务状态 -->
    <uses-permission android:name="android.permission.ACCESS_VIBRATOR_STATE" />
    
  • 第二步:优化振动调用逻辑
    调用前先校验设备和服务可用性,适配高版本系统的服务获取方式:

    private void vibrate() {
        Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
        // 先判断设备是否支持振动、服务是否正常
        if (vibrator == null || !vibrator.hasVibrator()) {
            return;
        }
        // Android 12及以上推荐使用VibratorManager获取振动实例
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
            VibratorManager vibratorManager = (VibratorManager) getSystemService(Context.VIBRATOR_MANAGER_SERVICE);
            if (vibratorManager != null) {
                vibrator = vibratorManager.getDefaultVibrator();
            }
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            vibrator.vibrate(VibrationEffect.createOneShot(500, VibrationEffect.DEFAULT_AMPLITUDE));
        } else {
            vibrator.vibrate(500);
        }
    }
    
  • 第三步:调整业务代码调用顺序
    避免后续逻辑抢占系统资源导致振动请求被丢弃,优化后的业务代码示例:

    private void submitQRcode(String houseid) {
        // 先触发振动
        vibrate();
        Log.d(TAG, "submitQRcode: " + houseid);
        if (houseid.substring(0, 2).matches("^[HhPp]+$"))
            validateTypeOfCollection(houseid);
        else if (houseid.substring(0, 2).matches("^[GgPp]+$"))
            startSubmitQRAsyncTask(houseid, -1, null);
        else if (houseid.substring(0, 2).matches("^[DdYy]+$"))
            getDumpYardDetails(houseid);
        else {
            AUtils.warning(QRcodeScannerActivity.this, mContext.getResources().getString(R.string.qr_error));
            // 扫码错误需重启预览时,延迟100ms执行,保证振动请求先被系统处理
            new Handler(Looper.getMainLooper()).postDelayed(this::restartPreview, 100);
        }
    }
    
  • 第四步:兼容厂商定制系统
    小米、华为等国产定制系统会默认禁止第三方应用的振动权限,若上述配置都生效仍无振动,可引导用户手动开启:应用信息 -> 权限管理 -> 允许振动,或在通知管理中开启振动权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 14:06:03