开发者社区 问答 正文

如何通过功能调用启用浮动操作按钮?

我正在使用android sipmanager实现一个简单的sip调用。在两个座席之间建立呼叫后,我想在屏幕上显示下面列出的浮动操作按钮。但是有些代码永远不会激活,因此无法在成功调用后使该按钮可见。它确实显示日志。任何帮助将不胜感激

SipAudioCall.Listener listener = new SipAudioCall.Listener() {

        /**
         * Name: onCallEstablished
         * Description: onCallEstablished is called when the
         * user establishes a call. This method
         * will enable the User to talk to the
         * person on the opposite line.
         */


       @Override
        public void onCallEstablished(SipAudioCall call) {



           super.onCallEstablished(call);

           call.startAudio();
           call.setSpeakerMode(true);
           //it does shows log in console 
           Log.e("$$", "Manager was instantiated");  

          // it doesnt change floating action button to visible
           View view7 =findViewById(R.id.fab6);
           view7.setVisibility(View.VISIBLE);

           setText("Call ESTABLISEHED");

            if (call.isMuted()) {
                call.toggleMute();
            }

}

展开
收起
被纵养的懒猫 2019-10-08 17:36:19 519 分享 版权
阿里云 AI 助理回答

从你的描述来看,问题似乎出在尝试更新UI元素(即Floating Action Button)的可见性上,而这一操作应该在主线程中进行。在Android中,SipAudioCall.Listener的回调方法(如onCallEstablished)可能不在UI线程上执行,因此直接修改UI元素可能会没有效果。

为了解决这个问题,你需要将修改UI的操作放到主线程中执行。你可以使用runOnUiThread方法来确保UI更新代码在正确的线程上运行。以下是修改后的代码示例:

SipAudioCall.Listener listener = new SipAudioCall.Listener() {
    @Override
    public void onCallEstablished(SipAudioCall call) {
        super.onCallEstablished(call);

        call.startAudio();
        call.setSpeakerMode(true);
        
        Log.e("$$", "Manager was instantiated");

        // 使用runOnUiThread确保UI操作在主线程执行
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                View view7 = findViewById(R.id.fab6);
                view7.setVisibility(View.VISIBLE);

                // 假设setText是一个可以设置文本的方法,需要确保它也在主线程调用
                setText("Call ESTABLISHED");

                if (call.isMuted()) {
                    call.toggleMute();
                }
            }
        });
    }
};

这段代码中,runOnUiThread方法是Activity类的一个方法,它接收一个Runnable对象并在UI线程上执行它。这样,无论当前回调在哪个线程上触发,UI更新都会正确地在主线程上执行,从而避免了UI更新不生效的问题。

请确保你是在一个Activity或Fragment的上下文中调用了这个方法,因为runOnUiThread是这些类的一部分。如果你在其他类型的组件中(比如Service),则需要采用其他方式来处理UI更新,比如通过BroadcastReceiver或者EventBus通知到UI组件。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: