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