PAYATHON 2026

Android 支付宝刷脸付支付后未释放摄像头怎么办?

支付小周

结论

支付流程结束后,应主动调用 SmileService 的停止接口,释放刷脸组件占用的摄像头。使用常见的 SmileService1.9.3.jar 接口时,通常需要在支付成功、失败或取消后调用:

SmileService.getInstance().stopSmile();

不要直接调用 Android Camera.release() 强制释放摄像头。摄像头由支付宝刷脸组件打开,应用通常无法取得对应的 Camera 实例,应交由 SmileService 关闭。

原因

收到刷脸结果回调,只能说明识别或支付流程已有结果,不一定表示刷脸页面已经退出,摄像头也未必自动释放。

如果应用收到结果后直接跳转页面,却没有停止 SmileService,组件内部的预览、识别线程或摄像头会话可能仍在运行。此时再通过 Camera、Camera2 或扫码组件打开摄像头,可能出现摄像头被占用、打开失败或黑屏。

处理方式

建议将释放摄像头的操作集中到统一的流程结束方法中,并覆盖以下情况:

  • 支付成功;
  • 支付失败;
  • 用户取消;
  • 页面关闭;
  • Activity 异常销毁。

示例:

private boolean smileStarted = false;

private void startFacePay() {
    smileStarted = true;

    SmileService.getInstance().startSmile(
            this,
            result -> {
                try {
                    handleSmileResult(result);
                } finally {
                    stopFacePay();
                }
            }
    );
}

private void stopFacePay() {
    if (!smileStarted) {
        return;
    }

    smileStarted = false;

    try {
        SmileService.getInstance().stopSmile();
    } catch (Exception e) {
        Log.e("FacePay", "Failed to stop SmileService", e);
    }
}

@Override
protected void onDestroy() {
    stopFacePay();
    super.onDestroy();
}

不同设备厂商提供的接入包可能使用不同的 startSmile() 参数和回调类型。项目现有的启动代码可以保留,重点是确保所有结束分支都会调用 stopSmile()。

如果支付结果还要异步提交到业务服务器,不必等网络请求全部结束后再释放摄像头。刷脸采集完成后,可以先停止刷脸服务,再继续处理订单状态:

private void onFacePayResult(Map<String, String> result) {
    stopFacePay();

    // 后续处理订单查询、支付确认或页面跳转
    processPaymentResult(result);
}

页面切换后仍无法打开摄像头

stopSmile() 可能需要异步清理资源,因此调用后不要立即反复打开其他摄像头。可以先关闭刷脸界面,待生命周期稳定后,再启动扫码或拍照功能:

private void switchToOtherCameraFeature() {
    stopFacePay();

    new Handler(Looper.getMainLooper()).postDelayed(
            this::openOtherCamera,
            300L
    );
}

这里的 300L 只是工程上的缓冲示例,并非支付宝 SDK 规定的固定值。具体时长应根据设备实际释放耗时调整,也不要用无限重试来掩盖资源没有释放的问题。

注意事项

  1. stopSmile() 最好只调用一次。可以通过状态变量避免支付回调和 onDestroy() 重复执行清理。
  2. 不要通过反射获取支付宝组件内部的摄像头对象,也不要在业务代码中直接调用 Camera.release()。
  3. 如果项目使用定制版 SmileService1.9.3.jar,公开接口的名称可能不同。应查看该 JAR 随附的接入文档或 IDE 自动补全,确认是否提供 stopSmile()、release()、destroy() 等退出接口,并调用厂商规定的方法。
  4. 调用停止接口后,如果摄像头仍被占用,还应检查刷脸 Activity、Service 或 Dialog 是否仍然存活,以及是否重复调用了 startSmile()。
  5. 如果摄像头依然无法释放,需要记录刷脸启动、结果回调、停止调用和 Activity 生命周期日志,并向设备或支付宝刷脸付 SDK 的提供方确认该 1.9.3 包是否存在特定机型兼容问题。不要只靠杀进程解决,否则可能影响支付结果处理和用户体验。

备注:内容仅供参考。