Android Studio开发Sinch通话调用callPhoneNumber报SinchClient not started崩溃
错误原因
- SinchClient的
start()方法是异步执行逻辑,调用后不会立刻完成初始化流程。你在onCreate中完成初始化配置后直接开放了通话按钮点击权限,用户点击时大概率客户端还未完成启动,因此触发「SinchClient not started」异常。 - 未添加SinchClient启动状态监听,无法确认初始化结果,也无法在启动成功后再开放通话功能。
- 点击事件中未做启动状态兜底校验,极端场景下即使加了监听也可能触发异常。
- 原有代码中调用
callPhoneNumber后未将返回的Call实例赋值给全局变量,也未绑定通话监听器,后续挂断逻辑、通话状态监听都会失效。
修复步骤
- 导入缺失的依赖类(如果已导入可跳过)
import com.sinch.android.rtc.SinchClientListener; import com.sinch.android.rtc.ClientRegistration;
- 初始化按钮时默认禁用,避免用户提前点击
在onCreate中找到按钮初始化代码,修改为:
button = findViewById(R.id.button); button.setEnabled(false); // 初始化完成前禁止点击 callState = findViewById(R.id.callState);
- 给SinchClient添加启动状态监听,在
sinchClient.start()调用前添加如下代码:
sinchClient.addSinchClientListener(new SinchClientListener() { @Override public void onClientStarted(SinchClient client) { // 启动成功,开放按钮点击权限 runOnUiThread(() -> { button.setEnabled(true); Toast.makeText(MainActivity.this, "通话服务初始化完成", Toast.LENGTH_SHORT).show(); }); } @Override public void onClientFailed(SinchClient client, SinchError error) { // 启动失败,打印错误信息排查 runOnUiThread(() -> { Toast.makeText(MainActivity.this, "通话服务初始化失败:" + error.getMessage(), Toast.LENGTH_SHORT).show(); Log.e("SinchError", "启动失败:" + error.getMessage()); }); } @Override public void onClientStopped(SinchClient client) {} @Override public void onLogMessage(int level, String area, String message) {} @Override public void onRegistrationCredentialsRequired(SinchClient client, ClientRegistration registrationCallback) {} });
- 点击事件中添加启动状态兜底校验,同时补全通话实例赋值逻辑:
修改按钮点击事件中的逻辑:
button.setOnClickListener(view -> { if (call == null) { // 兜底校验客户端是否启动完成 if (!isStarted()) { Toast.makeText(MainActivity.this, "通话服务正在初始化,请稍后再试", Toast.LENGTH_SHORT).show(); return; } try { CallClient callClient = sinchClient.getCallClient(); // 补全call实例赋值、监听器绑定逻辑 call = callClient.callPhoneNumber("+16315192247"); call.addCallListener(new SinchCallListener()); button.setText("Hang Up"); }catch (Exception e){ Log.d("checksinch", e.getMessage()); } } else { call.hangup(); call = null; button.setText("Call"); } });
附加注意事项
你当前代码中userId写死为固定值172976,如果是多用户使用场景需要替换为当前登录用户的唯一标识,否则会出现同账号互踢、启动失败的问题。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

